/* 题意: 有一个S串和一个T串,长度均小于1,000,000, 设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加, 若U串后缀为T,则去掉这个后缀继续流程。输出最后的S串。 */ //思路:把U串作为母串 动态匹配!! 因为an串中的长度是会变的 删掉之后的后缀也会变 #include<bits/stdc++.h> using namespace std; #define N 1000005 int nex[N],f[N]; char an[N]; void get_nex(char b[],int len) { nex[1]=nex[0]=0; for(int i=2,j=0;i<len;i++){ while(j>0&&b[i]!=b[j+1]) j=nex[j]; if(b[i]==b[j+1]) j++; nex[i]=j; } } void solve(char a[],int lena,char b[],int lenb) { int ans=0; //约定下标从1开始 for(int i=1,j=0;i<=lena;i++){ j=f[ans]; an[++ans]=a[i]; while(j>0&&(j==lenb||an[ans]!=b[j+1])) j=nex[j]; if(an[ans]==b[j+1]) j++; f[ans]=j; if(j==lenb) ans-=lenb; } for(int i=1;i<=ans;i++) printf("%c",an[i]); } char a[N],b[N]; int main() { scanf("%s%s",a+1,b+1); int len=strlen(b+1); get_nex(b,len); int len1=strlen(a+1); solve(a,len1,b,len); } /* momooofun moo */