B2135 单词替换 (变式)
原题地址
更改:改为someone中的one也能被替换
#include<bits/stdc++.h>
using namespace std;
char s[210],a[110],b[110];
int la,lb,ls,nowtop,nowend=-1,nowoutput=1;
int main()
{
while(1)
{
char now_input;
scanf("%c",&now_input);
if(now_input=='\n')
break;
s[++ls]=now_input;
}
while(1)
{
char now_input;
scanf("%c",&now_input);
if(now_input=='\n')
break;
a[++la]=now_input;
}
while(scanf("%c",&b[++lb])!=EOF)
{
}
lb--;
//cout<<ls<<" "<<la<<" "<<lb<<endl;
for(int i=1;i<=ls;i++)
{
if(a[1]==s[i]&&nowend!=i-1)
{
nowtop=i;//nowtop是指当前查找单词的起点对应句子s中的坐标
}
nowend=i;//nowend是指当前查找单词的终点对应句子s中的坐标
if(a[i-nowtop+1]==s[i])
{
if(nowend-nowtop+1==la)
{
for(int j=1;j<=lb;j++)
{
cout<<b[j];
}
nowend=i+1;
nowtop=i+1;
nowoutput=i+1;
}
continue;
}
else
nowtop=i+1;//以免中间不匹配还在比较后面的,比如ome与one 如果不加这个就会继续比较第三个,发现仍然匹配,然后把ome当作one。
//而设置为i+1(即下次循环的i)的目的是,使下一次循环的a[i-nowtop+1]直接变回a[1],相当于重新比较了
if(nowoutput==0)//nowoutput是想记录下次输出从s的哪个坐标开始
nowoutput++;
for(int j=nowoutput;j<=nowend;j++)
{
cout<<s[j];
}
nowoutput=nowend+1;//记录下一次输出的起始点:nowend+1
}
return 0;
}