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. Json的简单介绍和解析

    Json:JavaScript对象表示法(JavaScript Object Noatation) Json是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅读和编写,同时也 ...

  2. LeetCode(38)题解: Count and Say

    https://leetcode.com/problems/count-and-say/ 题目: The count-and-say sequence is the sequence of integ ...

  3. These interactions can be expressed as complicated, large scale graphs. Mining data requires a distributed data processing engine

    https://databricks.com/blog/2014/08/14/mining-graph-data-with-spark-at-alibaba-taobao.html

  4. Android cookies正确的更新方式

    之前的更新方式 一搜cookies的使用,非常easy搜到非常多文章.主要的几步大致同样.例如以下图: 基本上都要求大家先调用cookieManager.removeAllCookie()或者调用 c ...

  5. JS是否确认提示 +页面跳转

    JS友好提示 +页面跳转 function logout()...{if (confirm("你确定要注销身份吗?是-选择确定,否-选择取消"))...{window.locati ...

  6. (linux)INIT_WORK和INIT_DELAYED_WORK详解

      朋友,你相信,一只蝴蝶在北京拍拍翅膀,将使得纽约几个月后出现比狂风还厉害的龙卷风吗?看过那部经典的影片蝴蝶效应的朋友们一定会说,这不就是蝴蝶效应吗.没错.蝴蝶效应其实是混沌学理论中的一个概念.它是 ...

  7. BootLoader与Linux内核的参数传递【转】

    本文转载自:http://blog.sina.com.cn/s/blog_476d8cf30100rttx.html 在嵌入式系统中,BootLoader 是用来初始化硬件,加载内核,传递参数.因为嵌 ...

  8. JS点击查看更多内容 控制段落文字展开折叠

    JavaScript+jQuery实现的文字展开折叠效果,点击文字后文字内容会完整的显示出来,控制段落来显示文字,不需要的时候,可以再次点击后将内容折叠起来,也就是隐藏了一部分内容.点击查看更多的功能 ...

  9. codeforces 459 A. Pashmak and Garden 解题报告

    题目链接:http://codeforces.com/problemset/problem/459/A 题目意思:给出两个点的坐标你,问能否判断是一个正方形,能则输出剩下两点的坐标,不能就输出 -1. ...

  10. 转:创建表空间,删除后再次创建,报错ORA-01119

    原文:http://www.it2down.com/it-oracle-develop/57816.htm 我是个ORACLE新手,在删除了表空间,然后再创建怎么会提示出错? 删除表空间:drop t ...