1598: 最长公共前缀
Time Limit: 1 Sec
Memory Limit: 128 MB
Submit: 73
Solved: 62
[
Submit][
Status][
Web Board]
1598: 最长公共前缀
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 73 Solved: 62
[ Submit][ Status][ Web Board]
Description
给定两个字符串s和t,现有一个扫描器,从s的最左边开始向右扫描,每次扫描到一个t就把这一段删除,输出能发现t的个数。
Input
第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个字符串s,第二行一个字符串t,字符串长度不超过1000000。
Output
对于每组数据,输出答案。
Sample Input
2
ababab
ab
ababab
ba
Sample Output
3
2
HINT
Source
#include <stdio.h>
#include <string.h>
#define N 1000005
char t[N],w[N];
int nxt[N];
int n,m;
void getnext(){
int j, k;
j = 0; k = -1; nxt[0] = -1;
while(j<m){
if (k==-1 || w[j]==w[k]){
nxt[++j] = ++k;
}
else{
k = nxt[k];
}
}
}
int kmp(){
getnext();
int ans=0;
int j, k;
j = 0; k = 0;
while(j<n){
if (k==-1 || w[k]==t[j]){
++k;++j;
}
else{
k = nxt[k];
}
if(k==m)
{
k=nxt[k];
ans++;
}
}
return ans;
}
int main()
{
int c;
scanf("%d",&c);
while(c--)
{
scanf("%s%s",t,w);
n=strlen(t);
m=strlen(w);
printf("%d\n",kmp());
}
return 0;
}