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