4.5 编写从串s中删除所有与串t相同的子串的算法。
#include<iostream>
#define MaxSize 11
using namespace std;
int Next[MaxSize];
void GetNext(string t){
Next[0]=-1;
int i=0,j=-1;
int s=t.size();
while(i<s){
if(j==-1||t[i]==t[j]) Next[++i]=++j;
else j=Next[j];
}
}
string s1;
void KMP(string s,string t){
int i=0,j=0,x=0;
int a=s.size(),b=t.size();
while(i<a&&j<b){
if(j==-1||s[i]==t[j]){
i++,j++;
}
else j=Next[j];//匹配失败
if(j==b){
j=0;
for(int k=x;k<i-b;k++)
s1+=s[k];
x=i;//x每次等循环过后指向下一个i-b之前的位置[前i,i-b]
}
}
for(int k=x;k<i;k++)//最后剩下的元素依次输出
s1+=s[k];
}
int main()
{
string s,t; cin>>s>>t;
GetNext(t);
KMP(s,t);
cout<<s1;//输出还剩下的
return 0;
}