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. 嵌入式开发之davinci---8148/8127/8168 中dsp c674的浮点和定点兼容

    c674: 是c67(浮点)+c64(定点) 兼容的 http://processors.wiki.ti.com/index.php/-mv_option_to_use_with_the_C674x ...

  2. js之substr和substring的差别

    今天有人在群里问这两个的差别,借这个机会在这罗列下 substring(from,to) 開始和结束的位置,从零開始的索引 參数     描写叙述 from     必需. 一个非负的整数,规定要提取 ...

  3. python 爬虫1 開始,先拿新浪微博開始

    刚刚開始学. 目的地是两个.一个微博,一个贴吧 存入的话,临时还没想那么多.先存到本地目录吧 分词和推荐后面在整合 mysql mongodb hadoop redius 后面在用 我最终知道为什么大 ...

  4. gradle in action 笔记

    原网址 https://lippiouyang.gitbooks.io/gradle-in-action-cn/content/

  5. 解决pyspark-linux-windowsIDE JAVA_HOME not set

    对 os.environ 赋值 ssh://root@192.168.2.51:22/usr/bin/python -u /home/data/tmp_test/trunk/personas/tmp_ ...

  6. NEU 1685: All Pair Shortest Path

    题目描述 Bobo has a directed graph G with n vertex labeled by 1,2,3,..n. Let D(i,j) be the number of edg ...

  7. HDU1520 Anniversary party —— 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  8. flywaydb and sql server

    https://flywaydb.org/documentation/database/sqlserver How Flyway works https://flywaydb.org/getstart ...

  9. mysql 5.5升级到5.7版本操作流程

    一.备份原来 phpStudy 中 MySQL 安装目录 二.把下载的 MySQL 压缩文件解压至 phpStudy 下的 MySQL目录,复制 my-default.ini ,重命名为 my.ini ...

  10. codeforces 667D D. World Tour(最短路)

    题目链接: D. World Tour time limit per test 5 seconds memory limit per test 512 megabytes input standard ...