题目描述
题解
首先kmp求出来失配函数,然后暴力匹配。
如果当前位可以匹配,那么将其压入栈中;如果不能匹配,蹦到它的失配开始匹配;如果有一个完整的子串被压入栈中了,暴力将这个子串弹出。
注意弹出了一个串了之后要恢复到栈顶元素之前匹配到的位置 。
这样的话最终弹出的都是合法的串,没有弹出的就是无法匹配的。
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 1000005
char s[N],w[N];
int lw,ls,T[N],stack[N],loc[N],top;
void calc_T()
{
T[0]=-1;
for (int i=0,j;i<lw;++i)
{
j=T[i];
while (j!=-1&&w[i]!=w[j])
j=T[j];
T[i+1]=++j;
}
}
int main()
{
scanf("%s",s);ls=strlen(s);
scanf("%s",w);lw=strlen(w);
calc_T();
for (int i=0,j=0;i<ls;++i)
{
while (j!=-1&&s[i]!=w[j])
j=T[j];
++j;
stack[++top]=i;
loc[top]=j;
if (j==lw)
{
for (int k=1;k<=lw;++k)
--top;
j=loc[top];
}
}
for (int i=1;i<=top;++i)
putchar(s[stack[i]]);
}