题目是说给你一个替换串和目标串。把一个长串中的所有的替换串替换为目标串而且不递归地替换。
很简单,直接做一次KMP然后直接替换。
注意替换后跳到替换串的尾部。
注意大小写的问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 50550
using namespace std;
char s0[111],s1[111],s[maxn];
int f[111],L;
bool tag[maxn];
int n,m;
bool equal(char c1,char c2)
{
if (c1==c2) return true;
if (c1>c2) swap(c1,c2);
c1=c1-'A'+'a';
if (c1==c2) return true;
return false;
}
void getfail()
{
memset(f,0,sizeof f);
f[1]=0;
for (int i=2; s0[i]; i++)
{
int k=f[i-1];
while (k && equal(s0[k+1],s0[i])==false) k=f[k];
if (equal(s0[k+1],s0[i])) f[i]=k+1;
else f[i]=0;
}
}
void trans(char ss[])
{
for (int i=0; ss[i]; i++)
{
if (ss[i]>='A' && ss[i]<='Z') ss[i]=ss[i]-'A'+'a';
}
}
int main()
{
while (gets(s0+1))
{
gets(s1+1),gets(s+1);
getfail();
L=strlen(s0+1);
memset(tag,false,sizeof tag);
int cur=0;
for (int i=1; s[i]; i++)
{
if (equal(s0[cur+1],s[i])) cur++;
else
{
int k=f[cur];
while (k && equal(s0[k+1],s[i])==false) k=f[k];
if (equal(s0[k+1],s[i])) cur=k+1;
else cur=0;
}
if (cur==L)
{
tag[i]=true;
cur=0;
}
}
for (int i=1; s[i]; i++)
{
if (tag[i+L-1]==true)
{
printf("%s",s1+1);
i=i+L-1;
}
else printf("%c",s[i]);
}
printf("
");
}
return 0;
}