Update:smz說regex秒過Orz,yzd記在這里了。
聽說今年天梯賽有個煩人的模擬,我便被隊友逼着試做一下……一發15,二發20.記一記,要不然枉費我寫這么久……
自己還是代碼能力太菜了,校內大佬依舊隨手A過去,你吉老師該AK還是AK……
調調改改的,很丑,懶得優化寫法了。
大概思路就是先把最好改的改了:大小寫、標點、空格。空格你只要判斷它后面是不是字母就行了,不是字母就把它刪了。
上面是改了也沒啥影響的,然后我的方法是先把can you這種東西找到(免得你把I和me改成you結果出鍋),刪了you,在can的位置標記,這樣輸出時多輸出個I。
然后再把me和I的位置找到,標記上(不直接改是因為會影響上一個改動的相對位置),然后輸出時改為輸出you。
口胡起來很簡單,實現起來……並不推薦這么寫。真正寫的時候因為是動態的所以會有很多細節,所以這個方法並不好。
1 const int maxn = 1e3 + 5; 2 int T; 3 string s, ans; 4 queue<int> Q; 5 queue<P> q; 6 7 void deal(string s) { 8 for (int i = 0; i < s.length(); ++i) { 9 if (isalpha(s[i]) && s[i] <= 'Z' && s[i] >= 'A' && s[i] != 'I') s[i] = s[i] - 'A' + 'a'; 10 if (s[i] == '?') s[i] = '!'; 11 } 12 while (s[0] == ' ') s.erase(0, 1); 13 while (s[s.length() - 1] == ' ') s.erase(s.length() - 1, 1); 14 15 string t = "", tmp = "", last = ""; 16 for (int i = 0; i < s.length(); ++i) { 17 if (i < s.length() - 1 && s[i] == ' ' && !isdigit(s[i + 1]) && !isalpha(s[i + 1])) { 18 continue; 19 } 20 t += s[i]; 21 } 22 s = t; 23 24 t = "", tmp = "", last = ""; 25 int lastpos = -1, pos = -1; 26 for (int i = 0; i < s.length(); ++i) { 27 if (isalpha(s[i])) { 28 t += s[i]; 29 } else { 30 if (t == "you" && (last == "can" || last == "could") && s[pos] == ' ') { 31 Q.push(lastpos - 4 * Q.size()); 32 tmp.erase(tmp.length() - 1, 1); 33 } else { 34 tmp += t; 35 } 36 last = t; 37 pos = i; 38 lastpos = i - t.length() - 1; 39 t = ""; 40 tmp += s[i]; 41 } 42 } 43 if (t != "") { 44 if (t == "you" && (last == "can" || last == "could") && s[pos] == ' ') { 45 Q.push(lastpos - 4 * Q.size()); 46 tmp.erase(tmp.length() - 1, 1); 47 } else { 48 tmp += t; 49 } 50 } 51 52 t = "", ans = ""; 53 for (int i = 0; i < tmp.length(); ++i) { 54 if (isalpha(tmp[i])) { 55 t += tmp[i]; 56 } else { 57 if (t == "I" || t == "me") { 58 q.push(P(i - t.length(), t.length())); 59 } 60 ans += t; 61 ans += tmp[i]; 62 t = ""; 63 } 64 } 65 if (t != "") { 66 if (t == "I" || t == "me") { 67 q.push(P(tmp.length() - t.length(), t.length())); 68 } 69 ans += t; 70 } 71 } 72 73 int main() { 74 for (scanf("%d", &T), getchar(); T; T--) { 75 while (!Q.empty()) Q.pop(); 76 getline(cin, s); 77 cout << s << endl; 78 deal(s); 79 cout << "AI: "; 80 if (Q.size() && Q.front() == -1) cout << "I ", Q.pop(); 81 for (int i = 0; i < ans.length(); ++i) { 82 if (q.size() && q.front().first == i) { 83 cout << "you"; 84 i += q.front().second - 1; 85 q.pop(); 86 continue; 87 } 88 cout << ans[i]; 89 if (Q.size() && Q.front() == i) { 90 cout << "I "; 91 Q.pop(); 92 } 93 } 94 cout << endl; 95 } 96 97 return 0; 98 }