【洛谷P4824】Censoring S【KMP】

【洛谷P4824】Censoring S【KMP】
l i n k link link

分析:

K M P KMP KMP典中典
在匹配过程中 如果匹配了 T T T 就可将 T T T删除 用栈维护
删完后从栈顶能匹配的最大位置开始 继续 K M P KMP KMP

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e6+5;
char a[N],b[N];
int top,st[N],j,fail[N],len[N],lena,lenb;
int main()
{	
	scanf("%s%s",a+1,b+1);
	lena=strlen(a+1);
	lenb=strlen(b+1);
	for(int i=2;i<=lenb;i++)
	{
		while(j&&b[i]!=b[j+1]) j=fail[j];
		if(b[i]==b[j+1]) j++;
		fail[i]=j;
	}
	j=0;
	for(int i=1;i<=lena;i++)
	{
		while(j&&a[i]!=b[j+1]) j=fail[j];
		if(a[i]==b[j+1]) j++;
		len[i]=j;
		st[++top]=i;
		if(lenb==j)
		{
			top=top-j;
			j=len[st[top]];
		}
	}
	for(int i=1;i<=top;i++)
		putchar(a[st[i]]);
    return 0;
}
上一篇:java-writeUTF(String s)vs writeObject(String s)


下一篇:2014-1-29 “老公 老公 老公 不要收起来