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 }

 

posted @ 2019-04-02 22:24  AlphaWA  阅读(934)  评论(0编辑  收藏  举报