frog is now a editor to censor so-called sensitive words (敏感词).
She has a long text
p
. Her job is relatively simple -- just to find the first occurence of sensitive word
w
and remove it.
frog repeats over and over again. Help her do the tedious work.
Input
The input consists of multiple tests. For each test:
The first line contains
1
string
w
. The second line contains
1
string
p
.
(
1≤length of w,p≤5⋅106
,
w,p
consists of only lowercase letter)
Output
For each test, write
1
string which denotes the censored text.
Sample Input
abc aaabcbc b bbb abc ab
Sample Output
a ab
我发现用封装好的类来做题一般都是超时!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX=5e6+5;
int next[MAX],tmp[MAX];
int length1,length2,n=0;
char str[MAX],m[MAX],ans[MAX];
void getnext()
{
next[1]=0;
for(int i=2,j=0;i<=length1;++i)
{
while(j>0&&m[j+1]!=m[i])
j=next[j];
if(m[j+1]==m[i])
j++;
next[i]=j;
}
}
void kmp()
{
int i,j=0;
n = 0;
for(i=1;i<=length2;i++){
ans[n] = str[i];
while(j>0&&m[j+1]!=ans[n])
j=next[j];
if(m[j+1]==ans[n])
j++;
n++;
tmp[n] = j;
if(j==length1){
n -= length1;
j = tmp[n];
}
}
}
int main()
{
while(scanf("%s%s",m+1,str+1)!=EOF){
str[0] = 0;
length1 = strlen(m+1);
length2 = strlen(str+1);
str[0] = '$';
getnext();
kmp();
for(int i=0;i<n;++i)
printf("%c",ans[i]);
printf("\n");
}
return 0;
}