题目描述 CodeMonkey终于下定决心用情书的方式向心爱的女神表白,当他历经几天几夜写完之后才知道女神有很多不喜欢的词,所以他不得不有把这些词删掉。例如:原文是:ILOVEYOU,女神不喜欢的词是‘LV’,‘O’那么最终情书要改成IEYU。现在已知女生不喜欢的词的集合S,CodeMonkey想知道刚写的情书会改成什么样?S={“HATE”,“SHIT”,“LV”,“O”,“FUCK”,“UGLY”,“MM”} 输入 多样例输入,每个样例输入一行情书原文,原文只包含大写英文字母,原文长度不超过1000 输出 对于每个样例,若是情书被删完则输出一行“LOSER”,否则输出情书的剩余内容 样例输入 ILOVEYOU
MM 样例输出 IEYU
LOSER 其实这题按模拟可以做出来,一直比较怵关于字符串处理的题,所以下手犹豫了。题解直接用了库函数,方便了不少,正好学习一下。我开始写的时候也是先用数组存下不能出现的字符串、每个字符串的长度(便于找到后减长度)。在ck()中用flag标记(如果为0说明当前串中已无禁词,否则while()一直调用)然后在禁词组中用find()找其出现的位置,找到了将flag赋为1,将这个禁词长度的每个字符变为@。在zhenghe()中用.size()找到字符串长度,直接加上不为@的字符。 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
string str;
const char dict[20][200]={"HATE","SHIT","LV","O","FUCK","UGLY","MM"};
const int leng[10]={4,4,2,1,4,4,2};
string zhenghe(string str)
{
string ans;
int n=str.size();
for(int i=0;i<n;i++) if(str[i]!='@') ans+=str[i];
return ans;
}
bool ck()
{
bool flag=false;
for(int i=0;i<7;i++)
{
int t=-1;
t=str.find(dict[i]);
if(~t)
{
flag=true;
for(int j=t;j<t+leng[i];j++)
{
str[j]='@';
}
}
}
str=zhenghe(str);
return flag;
}
int main()
{
freopen("std.in","r",stdin);
freopen("out.txt","w",stdout);
while(cin>>str)
{
while(ck());
if(str.size()) cout<<str<<endl;
else cout<<"LOSER\n";
}
return 0;
}
|