Advertisement
sacgajcvs

Untitled

Jan 14th, 2022
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.08 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void init(int N, char mString[]);
  4. void addWord(char mWord[]);
  5. void removeWord(char mWord[]);
  6. int correct(int mStart, int mEnd);
  7. void destory(char mResult[]);
  8.  
  9. #define ADD_WORD 100
  10. #define REMOVE_WORD 200
  11. #define CORRECT 300
  12.  
  13. #define MAX_LEN 40000
  14. #define MAX_WORD 10
  15.  
  16. static char buf_s[MAX_WORD + 2];
  17. static char buf_b1[MAX_LEN + 2];
  18. static char buf_b2[MAX_LEN + 2];
  19.  
  20. static int run() {
  21. int len;
  22. scanf("%d%s", &len, buf_b1);
  23.  
  24. init(len, buf_b1);
  25.  
  26. int cmdCount;
  27. scanf("%d", &cmdCount);
  28.  
  29. int ret_val = 1;
  30. int ftype, start, end, ret, ans;
  31. for(int i = 0; i < cmdCount; i++) {
  32. scanf("%d", &ftype);
  33. switch(ftype) {
  34. case ADD_WORD:
  35. scanf("%s", buf_s);
  36. addWord(buf_s);
  37. break;
  38. case REMOVE_WORD:
  39. scanf("%s", buf_s);
  40. removeWord(buf_s);
  41. break;
  42. case CORRECT:
  43. scanf("%d %d", &start, &end);
  44. ret = correct(start, end);
  45. scanf("%d", &ans);
  46. if(ret != ans) {
  47. ret_val = 0;
  48. }
  49. break;
  50. }
  51. }
  52.  
  53. for(int i = 0; i < len; i++) {
  54. buf_b2[i] = '\0';
  55. }
  56. destory(buf_b2);
  57.  
  58. scanf("%s", buf_b1);
  59. for(int i = 0; i < len; i++) {
  60. if(buf_b1[i] != buf_b2[i]) {
  61. ret_val = 0;
  62. }
  63. }
  64.  
  65. return ret_val;
  66. }
  67.  
  68. int main()
  69. {
  70. int T, MARK;
  71. scanf("%d %d", &T, &MARK);
  72.  
  73. for(int tc = 1; tc <= T; tc++) {
  74. if(run() == 1) {
  75. printf("#%d %d\n", tc, MARK);
  76. } else {
  77. printf("#%d 0\n", tc);
  78. }
  79. }
  80.  
  81. return 0;
  82. }
  83.  
  84. // Solutio starts here
  85.  
  86. #define DEF vector<trieNode>(26, trieNode())
  87.  
  88. struct trieNode {
  89. int next, tot;
  90. trieNode(): next(0), tot(0) {}
  91. };
  92.  
  93. vector<vector<trieNode>> trie;
  94. vector<bool> endWord;
  95. int cur;
  96. string words;
  97.  
  98. void add(string s) {
  99. int val = 1, x;
  100. for(int i = 0; i < s.length(); i++) {
  101. x = s[i] - 'a';
  102. if(trie[val][x].next == 0) {
  103. trie.push_back(DEF);
  104. endWord.push_back(false);
  105. trie[val][x].next = ++cur;
  106. }
  107. trie[val][x].tot += 1;
  108. val = trie[val][x].next;
  109. }
  110. // cerr << s << " " << val << endl;
  111. endWord[val] = true;
  112. }
  113.  
  114. void rem(string s) {
  115. int val = 1, x;
  116. for(int i = 0; i < s.length(); i++) {
  117. x = s[i] - 'a';
  118. trie[val][x].tot -= 1;
  119. val = trie[val][x].next;
  120. }
  121. endWord[val] = false;
  122. }
  123.  
  124. bool find(string s) {
  125. int val = 1, x;
  126. for(int i = 0; i < s.length(); i++) {
  127. x = s[i] - 'a';
  128. if(trie[val][x].tot == 0) {
  129. return false;
  130. }
  131. val = trie[val][x].next;
  132. }
  133. return endWord[val];
  134. }
  135.  
  136.  
  137. bool search(string& s, string& tmp, int val=1, bool f=false) {
  138. if(val == 0) {
  139. return 0;
  140. }
  141. if(s.length() == tmp.length()) {
  142. return endWord[val];
  143. }
  144. // cerr << "word = " << s << " " << tmp << " " << val << " " << f << endl;
  145. int i = tmp.length();
  146. int x = s[i] - 'a';
  147. if(f) {
  148. tmp += s[i];
  149. if(trie[val][x].tot != 0 && search(s, tmp, trie[val][x].next, f)) {
  150. return 1;
  151. }
  152. tmp.pop_back();
  153. } else {
  154. for(int z = 0; z < 26; z++) {
  155. tmp += (char)('a' + z);
  156. // cerr << x << " " << tmp << " " << z << endl;
  157. if(trie[val][z].tot != 0 && search(s, tmp, trie[val][z].next, (z != x))) {
  158. return 1;
  159. }
  160. tmp.pop_back();
  161. }
  162. }
  163. return 0;
  164. }
  165.  
  166. void init(int N, char mString[]) {
  167. trie.clear();
  168. endWord.clear();
  169. cur = 1;
  170.  
  171. trie.push_back(DEF);
  172. endWord.push_back(false);
  173. trie.push_back(DEF);
  174. endWord.push_back(false);
  175.  
  176. string tmpWord(mString);
  177. words = tmpWord;
  178. }
  179.  
  180. void addWord(char mWord[]) {
  181. string tmpWord(mWord);
  182. // cerr << "adding word = " << tmpWord << endl;
  183. add(tmpWord);
  184. // cerr << "word added\n";
  185. }
  186.  
  187. void removeWord(char mWord[]) {
  188. string tmpWord(mWord);
  189. // cerr << "deleting word = " << tmpWord << endl;
  190. rem(tmpWord);
  191. // cerr << "word deleted\n";
  192. }
  193.  
  194. int correct(int mStart, int mEnd) {
  195. int cur = mStart, pre;
  196. string curWord = "", newWord;
  197. // cerr << "correcting word\n";
  198. int ans = 0;
  199. while(1) {
  200. curWord = "";
  201. pre = cur;
  202. while(cur < words.length() && words[cur] != '_') {
  203. curWord += words[cur];
  204. cur++;
  205. }
  206. // cerr << "checking word = " << curWord << endl;
  207. newWord = "";
  208. if(!find(curWord) && search(curWord, newWord)) {
  209. // cerr << "found word = " << newWord << endl;
  210. for(int i = pre; i < cur; i++) {
  211. words[i] = newWord[i - pre];
  212. }
  213. ans += (newWord != curWord);
  214. }
  215. cur++;
  216. if(cur > mEnd) {
  217. break;
  218. }
  219.  
  220. }
  221. // cerr << "ending correction\n" << endl;
  222. return ans;
  223. }
  224.  
  225. void destory(char mResult[]) {
  226. for(int i = 0; i < words.length(); i++) {
  227. mResult[i] = words[i];
  228. }
  229. // cerr << "final result = " << words << endl;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement