写话机
输入文件名: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]!=':'&¬e[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.
谢谢。