PTA天梯赛训练题L1-064:估值一亿的AI核心代码(字符串模拟)
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 }