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<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); }