B.沼跃鱼 | |||||
| |||||
Description | |||||
fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼(“marshtomp”,不区分大小写)。 | |||||
Input | |||||
输入包括多行。每行是一个字符串,长度不超过200。 一行的末尾与下一行的开头没有关系。 | |||||
Output | |||||
输出包含多行,为输入按照描述中变换的结果。 | |||||
Sample Input | |||||
The Marshtomp has seen it all before. marshTomp is beaten by fjxmlhx! AmarshtompB | |||||
Sample Output | |||||
The fjxmlhx has seen it all before. fjxmlhx is beaten by fjxmlhx! AfjxmlhxB | |||||
Hint | |||||
不存在mar shto mp这种用空格分开的情况。 有可能一个句子中有两个以上“marshtomp”。 |
题目其实非常简单,字符串匹配然后替换,首先想到了KMP,但是我还是想到了暴力,因为字符串长度不会超过200,而且字符串的长度也是固定的,最多枚举191次就可以找到所有的子串,然后将其替换即可,一开始可能是我意志不够坚定,并没有在意,没有提醒队友可以不用KMP,直到ta做了很久很久,我也着急了,就用暴力做了一下,第一次搞错了数组下标的范围,但之后就对了,看来以后一旦分析出了题目思路,要及时与队友交流。。。
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char name[9]={'m','a','r','s','h','t','o','m','p'};
char doubi[9]={'f','j','x','m','l','h','x','*','*'};
void cmp(char *str,int s)
{
int i;
bool flag=true;
for(i=0;i<=8;i++)
{
if(str[s+i]!=name[i]&&str[s+i]!=name[i]-32)
{
flag=false;
break;
}
//cout<<str[s+i];
}
if(flag)
{
for(i=0;i<=8;i++)
{
str[s+i]=doubi[i];
}
}
}
int main()
{
char str[300];
int i,j,len;
while(gets(str))
{
len=strlen(str);
//cout<<len<<endl;
if(len<9)
{
cout<<str<<endl;
continue;
}
for(i=0;i<=len-9;i++)
{
cmp(str,i);
}
for(i=0;i<len;i++)
{
if(str[i]!='*')
cout<<str[i];
}
cout<<endl;
}
return 0;
}