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。
口胡起来很简单,实现起来……并不推荐这么写。真正写的时候因为是动态的所以会有很多细节,所以这个方法并不好。
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核心代码(字符串模拟)的更多相关文章
- PTA --- 天梯赛 L1-064 估值一亿的AI核心代码
L1-064 估值一亿的AI核心代码 (20 point(s)) 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多 ...
- L1-064 估值一亿的AI核心代码 (20 分)
L1-064 估值一亿的AI核心代码 (20 分) 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: ...
- PTA 估值一亿的AI核心代码
题面 比赛时被模拟题打自闭了,本来以为是个比较麻烦的模拟,实际上只要会C++的regex不到40行就能把这个题过掉了(orz smz) regex是用来处理正则表达式,里面有个函数regex_repl ...
- L1-064 估值一亿的AI核心代码
以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 021-024
忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 001-006
应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 052-053
今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 048-49
今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 040-41
近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...
随机推荐
- Mono 和 .NET Core比翼双飞
大家好,今天给大家分享.NET 蓝图之下的Mono和.NET Core 话题,微软在Build 2019 大会上给.NET 做了一个五年规划,所以分享的主题就是<Mono和.NET Core 比 ...
- 2016/06/02 网摘记录 svn 服务器端 客户端 安装使用
http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html http://www.cnblogs.com/xiaobaihom ...
- BootStrap-DualListBox怎样改造成为双树
BootStrap-DualListBox能够实现将所选择的列表项显示到右边,未选的列表项显示到左边. 但是左右两边的下拉框中都是单级列表.如果要实现将两边都是树(缩进树),选择某个节点时,其子节点也 ...
- swt_table 回车可编辑Esc取消
package 宿舍管理系统; import java.util.Hashtable; import org.eclipse.swt.SWT; import org.eclipse.swt.custo ...
- Mac OS X 开发环境搭建之利用 Parallel Desktop 安装 CentOS 7 [转载]
背景 在企业级软件系统中,数据库的地位是比较高的,而且一般都要求支持多种数据库,如 Oracle. DB2.MySQL 等,它们的最新版本大多都不再支持 Mac OS X 系统,所以装一个 Linux ...
- python 将屏幕输出定向到变量中
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import subprocess as sp def main(): cmd = 'syst ...
- hihocoder #1039 : 字符消除 ( 字符串处理类 ) 好久之前做的题目,具体的算法代码中阅读吧
#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...
- hdu 4022 Bombing(map,multiset)
题意:n个基地放在2维平面,然后m个炸弹人,每个炸弹人可以炸一行或者一列,输出每个炸弹人炸掉的基地个数. 思路:用map<int,multiset<int> >对应起来一行或者 ...
- Android studio 构建太慢
/*********************************************************************************** * Android studi ...
- SPOJ:Ada and Orange Tree (LCA+Bitset)
Ada the Ladybug lives near an orange tree. Instead of reading books, she investigates the oranges. T ...