KMP——字串清除

来源:互联网 发布:电脑网络上有个感叹号 编辑:程序博客网 时间:2024/06/03 12:58

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

abcabcabcabaabcbccc

Sample Output

5

Hint

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


分析:

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

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


代码如下:

#include<iostream>#include<cstring>#include<cstdio>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);}


1 0