sacgajcvs

Untitled

Jan 14th, 2022
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.82 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.  
  125. bool search(string& s, string& tmp, int val=1, bool f=false) {
  126. if(val == 0) {
  127. return 0;
  128. }
  129. if(s.length() == tmp.length()) {
  130. return endWord[val];
  131. }
  132. // cerr << "word = " << s << " " << tmp << " " << val << " " << f << endl;
  133. int i = tmp.length();
  134. int x = s[i] - 'a';
  135. if(f) {
  136. tmp += s[i];
  137. if(trie[val][x].tot != 0 && search(s, tmp, trie[val][x].next, f)) {
  138. return 1;
  139. }
  140. tmp.pop_back();
  141. } else {
  142. for(int z = 0; z < 26; z++) {
  143. tmp += (char)('a' + z);
  144. // cerr << x << " " << tmp << " " << z << endl;
  145. if(trie[val][z].tot != 0 && search(s, tmp, trie[val][z].next, (z != x))) {
  146. return 1;
  147. }
  148. tmp.pop_back();
  149. }
  150. }
  151. return 0;
  152. }
  153.  
  154. void init(int N, char mString[]) {
  155. trie.clear();
  156. endWord.clear();
  157. cur = 1;
  158.  
  159. trie.push_back(DEF);
  160. endWord.push_back(false);
  161. trie.push_back(DEF);
  162. endWord.push_back(false);
  163.  
  164. string tmpWord(mString);
  165. words = tmpWord;
  166. }
  167.  
  168. void addWord(char mWord[]) {
  169. string tmpWord(mWord);
  170. // cerr << "adding word = " << tmpWord << endl;
  171. add(tmpWord);
  172. // cerr << "word added\n";
  173. }
  174.  
  175. void removeWord(char mWord[]) {
  176. string tmpWord(mWord);
  177. // cerr << "deleting word = " << tmpWord << endl;
  178. rem(tmpWord);
  179. // cerr << "word deleted\n";
  180. }
  181.  
  182. int correct(int mStart, int mEnd) {
  183. int cur = mStart, pre;
  184. string curWord = "", newWord;
  185. // cerr << "correcting word\n";
  186. int ans = 0;
  187. while(1) {
  188. curWord = "";
  189. pre = cur;
  190. while(cur < words.length() && words[cur] != '_') {
  191. curWord += words[cur];
  192. cur++;
  193. }
  194. // cerr << "checking word = " << curWord << endl;
  195. newWord = "";
  196. if(search(curWord, newWord)) {
  197. // cerr << "found word = " << newWord << endl;
  198. for(int i = pre; i < cur; i++) {
  199. words[i] = newWord[i - pre];
  200. }
  201. ans += (newWord != curWord);
  202. }
  203. cur++;
  204. if(cur > mEnd) {
  205. break;
  206. }
  207.  
  208. }
  209. // cerr << "ending correction\n" << endl;
  210. return ans;
  211. }
  212.  
  213. void destory(char mResult[]) {
  214. for(int i = 0; i < words.length(); i++) {
  215. mResult[i] = words[i];
  216. }
  217. // cerr << "final result = " << words << endl;
  218. }
Advertisement
Add Comment
Please, Sign In to add comment