Update:smz说regex秒过Orz,yzd记在这里了。

听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久……

自己还是代码能力太菜了,校内大佬依旧随手A过去,你吉老师该AK还是AK……

调调改改的,很丑,懒得优化写法了。

大概思路就是先把最好改的改了:大小写、标点、空格。空格你只要判断它后面是不是字母就行了,不是字母就把它删了。

上面是改了也没啥影响的,然后我的方法是先把can you这种东西找到(免得你把I和me改成you结果出锅),删了you,在can的位置标记,这样输出时多输出个I。

然后再把me和I的位置找到,标记上(不直接改是因为会影响上一个改动的相对位置),然后输出时改为输出you。

口胡起来很简单,实现起来……并不推荐这么写。真正写的时候因为是动态的所以会有很多细节,所以这个方法并不好。

 const int maxn = 1e3 + ;
int T;
string s, ans;
queue<int> Q;
queue<P> q; void deal(string s) {
for (int i = ; i < s.length(); ++i) {
if (isalpha(s[i]) && s[i] <= 'Z' && s[i] >= 'A' && s[i] != 'I') s[i] = s[i] - 'A' + 'a';
if (s[i] == '?') s[i] = '!';
}
while (s[] == ' ') s.erase(, );
while (s[s.length() - ] == ' ') s.erase(s.length() - , ); string t = "", tmp = "", last = "";
for (int i = ; i < s.length(); ++i) {
if (i < s.length() - && s[i] == ' ' && !isdigit(s[i + ]) && !isalpha(s[i + ])) {
continue;
}
t += s[i];
}
s = t; t = "", tmp = "", last = "";
int lastpos = -, pos = -;
for (int i = ; i < s.length(); ++i) {
if (isalpha(s[i])) {
t += s[i];
} else {
if (t == "you" && (last == "can" || last == "could") && s[pos] == ' ') {
Q.push(lastpos - * Q.size());
tmp.erase(tmp.length() - , );
} else {
tmp += t;
}
last = t;
pos = i;
lastpos = i - t.length() - ;
t = "";
tmp += s[i];
}
}
if (t != "") {
if (t == "you" && (last == "can" || last == "could") && s[pos] == ' ') {
Q.push(lastpos - * Q.size());
tmp.erase(tmp.length() - , );
} else {
tmp += t;
}
} t = "", ans = "";
for (int i = ; i < tmp.length(); ++i) {
if (isalpha(tmp[i])) {
t += tmp[i];
} else {
if (t == "I" || t == "me") {
q.push(P(i - t.length(), t.length()));
}
ans += t;
ans += tmp[i];
t = "";
}
}
if (t != "") {
if (t == "I" || t == "me") {
q.push(P(tmp.length() - t.length(), t.length()));
}
ans += t;
}
} int main() {
for (scanf("%d", &T), getchar(); T; T--) {
while (!Q.empty()) Q.pop();
getline(cin, s);
cout << s << endl;
deal(s);
cout << "AI: ";
if (Q.size() && Q.front() == -) cout << "I ", Q.pop();
for (int i = ; i < ans.length(); ++i) {
if (q.size() && q.front().first == i) {
cout << "you";
i += q.front().second - ;
q.pop();
continue;
}
cout << ans[i];
if (Q.size() && Q.front() == i) {
cout << "I ";
Q.pop();
}
}
cout << endl;
} return ;
}

PTA天梯赛训练题L1-064:估值一亿的AI核心代码(字符串模拟)的更多相关文章

  1. PTA --- 天梯赛 L1-064 估值一亿的AI核心代码

    L1-064 估值一亿的AI核心代码 (20 point(s)) 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多 ...

  2. L1-064 估值一亿的AI核心代码 (20 分)

    L1-064 估值一亿的AI核心代码 (20 分)   以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: ...

  3. PTA 估值一亿的AI核心代码

    题面 比赛时被模拟题打自闭了,本来以为是个比较麻烦的模拟,实际上只要会C++的regex不到40行就能把这个题过掉了(orz smz) regex是用来处理正则表达式,里面有个函数regex_repl ...

  4. L1-064 估值一亿的AI核心代码

    以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...

  5. 『ACM C++』 PTA 天梯赛练习集L1 | 021-024

    忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...

  6. 『ACM C++』 PTA 天梯赛练习集L1 | 001-006

    应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...

  7. 『ACM C++』 PTA 天梯赛练习集L1 | 052-053

    今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...

  8. 『ACM C++』 PTA 天梯赛练习集L1 | 048-49

    今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...

  9. 『ACM C++』 PTA 天梯赛练习集L1 | 040-41

    近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...

随机推荐

  1. fruitstrap 安装.app文件

    1. 下载ipa的ios文件然后解压成.app的文件 2. 进入fruitstrap文件夹,copy .app文件到fruitstrap文件夹中 执行./fruitstrap -b umetrip.a ...

  2. 你的以太网速度足够快吗?四种更快的速度正在路上&#183;&#183;&#183;&#183;&#183;&#183;

    以太网的未来将远远超越下一个最快速度:为无处不在的网络协议绘制路径的网络project师们正在寻找新版本号来服务于各种应用程序. 在上周六的以太网联盟(一个行业组织,用于促进IEEE以太网标准)会议上 ...

  3. redis中的五种基本的数据结构

    1 String 基本的数据类型. 2 list 2.1 将元素放入一个list中 rpush mylist A rpush mylist B rpush mylist A 如果mylist本来是不存 ...

  4. set -- $variable

    1 set --的用途 给位置参数赋值. 2 $variable是如何赋值给位置参数的 假如variable=a b c?或者variable=a;b;c? 这里果然和IFS有关,默认情况下,vari ...

  5. Statelessness Provide credentials with the request. Each request MUST stand alone and should not be affected from previous conversation happened from same client in past.

    The server never relies on information from previous requests. Statelessness As per the REST (REpres ...

  6. android studio Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"

    android studio运行会遇到Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Reques ...

  7. C语言中的声明与定义的差别

    1.对于以下的声明语句 int a;        假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...

  8. rails find find_by where

    find根据id进行查询,像Product.find(3),查询语句是Product Load (0.1ms) SELECT "products".* FROM "pro ...

  9. bzoj3137: [Baltic2013]tracks

    炸一看好像很神仙的样子,其实就是个sb题 万年不见的1A 但是我们可以反过来想,先选一个起点到终点的联通块,然后这联通块后面相当于就能够走了,继续找联通块 然后就能发现直接相邻的脚步相同的边权为0,否 ...

  10. Servlet分页查询

    分页查询: 1.逻辑分页查询:用户第一次访问时就把全部数据访问出来,添加到一个大集合中,然后放到session中,进行转发.通过页码等的计算,把要显示的内容添加到一个小集合中,转发.遍历小集合以显示当 ...