KMP——字串清除

Description

我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串。现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中删除它,直到A串不为B串的子串,问你需要进行几次删除操作。 

Input

输入文件共2行,第一行一个字符串A(长度小于256),第二行一个字符串B。 
30%的数据是随机生成的; 
50%的数据满足输入文件大小小于300KB; 
100%的数据满足输入文件小于500KB,字符串A、B中只会出现英文字母。

Output

输出文件只有一个整数N。

Sample Input

abc
abcabcabaabcbccc

Sample Output

5

Hint

样例说明:abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc 


分析:

模拟一个栈,一旦栈顶的字符串和给出的相等,就出栈,ans++;

如何判断栈顶是否满足要求呢?当然是使用 KMP 算法的模型:


代码如下:

#include
#include
#include
using namespace std;
char s[505],ch,a[5000005];
int len,f[505],match[5000005];
void get_fail(){  //预处理回退表 ; 
	int i,j=0;
	for(i=2;i<=len;i++){
		while(j>0&&s[i]!=s[j+1])j=f[j];
		if(s[i]==s[j+1])j++;
		f[i]=j;
	}
} 
int main(){
	scanf("%s",s+1);
	len=strlen(s+1);
	get_fail();
	int i,j,ans;
	i=j=ans=0;
	while(scanf("%c",&ch)!=EOF){  	//	逐个字符读入; 
		i++;
		a[i]=ch;
		j=match[i-1];
		while(j>0&&s[j+1]!=a[i])j=f[j];  //	 kmp 
		if(s[j+1]==a[i])j++;
		match[i]=j;
		if(match[i]==len)ans++,i-=len;  //如果匹配,pop 
	}
	printf("%d",ans);
}


你可能感兴趣的:(字符串)