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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM