OI题库T2 求助
查看原帖
OI题库T2 求助
302584
DottedCalculator楼主2020/8/29 17:53
写话机

输入文件名:say.in

输出文件名:say.out

共 10 个测试点,每个测试点 10 分

每个测试点限时 1 秒,运行内存上限 512MB

在未来,伟大的科学家们发明了一种名为“写话机”的机器,这种机器可以记录人们交流中的话语并编辑成文本。

但这些事发生在未来,不过你可以模拟写话机的工作。

为了使你干的事尽量简单,我们简化了它的工作,现在它有下面几种功能:

add name 加入一个需要记录的人(他的名字为 namename),在他被删除之前他的话都要被记录。
delete name 删除一个需要记录的人(他的名字为 namename),在他被再次加入之前他的话都不需要被记录。
say name:content记录一句话,说的人是 namename,内容为 contentcontent。注意,如果这个人不在需要记录的人的名单内,请不要记录这句话。
withdraw name 撤销一句话。为了使它不那么麻烦,我们会给你一个人的名字 namename,你只需要撤销他最后说的一句话(不包括已经撤销的话)即可。注意,如果这个人最后一句说的话在五句聊天以外(包括五句,包括撤回的话),我们也不需要撤回这句话。
现在给你一系列以上格式的操作,请你输出最终记录了几句话,并且输出每句话的信息(说这句话的人的名字及内容)。

需要注意的是,我们有时候会给你一些无效的操作,比如删除本来就不在名单内的人。

输入格式
输入第一行一个数 nn,表示有 nn 条操作。

接下来 nn 行,每行表示一个操作。

输出格式
输出若干行,第一行为 [ans sentence recorded]:,其中 ansans 表示记录的句子的数量。

接下来 ansans 行,每行格式为 name:content 的一个字符串,表示名字为 namename 的人说了一句话,这句话的内容是 contentcontent。

数据规模与约定
对于 20\%20% 的数据:1 \le n \le 10^31≤n≤10 
3
 ;

对于另外 20\%20% 的数据:保证操作合法(包括保证 say 中的人名在名单内,不包括一定成功撤回);

对于 100\%100% 的数据:1 \le n \le 5 \times 10^51≤n≤5×10 
5
 ,保证人名长度 \le 5≤5 且人名中只会出现小写字母,保证每句话的长度 \le 10^3≤10 
3
  且只包含空格、大小写字母、数字和符号(符号包括.,,,?,!,')。

我的程序:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,cnt=0,cnt2=0,ans=0;
	char name[1000][5],del[5],note[20][1000],t[5];
	string s;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		if(s=="add"){
			cin>>name[cnt];
			cnt++;
		}
		if(s=="delete"){
			cin>>del;
			for(int j=0;j<cnt;j++){
				if(name[j]==del){
					memset(name[j],0,sizeof(name[j]));
					break;
				}
			}
			for(int j=0;j<cnt2;j++){
				int p=0;int z=0;
			memset(t,0,sizeof(t));
			while(note[j][p]!=':'){
				if(note[j][p]!=' '){
					t[z]=note[j][p];
					z++;
				}
				p++;
			}
				if(t[0]==del[0]&&t[1]==del[1]){
				    memset(note[j],0,sizeof(note[j]));
				    ans--;
				}
			}
		}
		if(s=="say"){
			cin.get(note[cnt2],1000);
			int p=0;int z=0;
			memset(t,0,sizeof(t));
			while(note[cnt2][p]!=':'){
				if(note[cnt2][p]!=' '){
					t[z]=note[cnt2][p];
					z++;
				}
				p++;
			}
			int flag=0;
			for(int j=0;j<cnt;j++){
				if(name[j][0]==t[0]&&name[j][1]==t[1]){
					flag=1;
				}   
			}
			if(flag){
				cnt2++;ans++;
			}    
			else    memset(note[cnt2],0,sizeof(note[cnt2]));
		}
		if(s=="withdraw"){
			cin>>del;
			for(int j=cnt2-1;j>cnt2-5&&j>=0;j--){
				int p=0;
			memset(t,0,sizeof(t));
			while(note[j][p]!=':'&&note[j][p]){
				t[p]=note[j][p];
				p++;
			}
			if(t==del){
				memset(note[j],0,sizeof(note[j]));ans--;break;
			}
			}
		}
	}
	cout<<"["<<ans<<" sentence recorded]:"<<endl;
	int x=0;int p=0;
	while(x<ans){
		if(note[p]){
			x++;cout<<note[p]<<endl;
		}
		p++;
	}
	getchar();getchar();
	return 0;
}

样例输入:

8
add dij
add limit
say dij:limit ak ioi.
say limit:I AK.
add CM
say CM:That's so easy.
delete limit
withdraw limit

正确输出:

[2 sentence recorded]:
dij:limit ak ioi.
CM:that's so easy.

我的程序输出:

[2 sentence recorded]:
 dij:limit ak ioi.


谢谢。

2020/8/29 17:53
加载中...