• 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 }
  • 相关阅读:
    045_分页查询插件 bootstrap_pagination
    Kali中文乱码问题
    将一行很长的js代码格式化输出方便查看
    使用gcc编译c语言解码ascii码
    Netcat
    阿里云万网注册个人域名并配置解析主机
    使用阿里云服务器配置frp实现Windows系统RDP内网穿透
    mysql数据库行级锁的使用(二)
    关于mysql数据库行级锁的使用(一)
    关于volatile的可见性问题
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/10645873.html
Copyright © 2020-2023  润新知