您的位置:首页 > 其它

CSU 1598 最长公共前缀

2015-08-13 09:12 204 查看




1598: 最长公共前缀

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 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

国防科学技术大学第十八届银河之光文化节ACM程序设计竞赛初赛

[Submit][Status][Web
Board]

和HDU 1686 Oulipo那道题几乎一样,稍微改了改就一次过了,这道题是学校OJ上的题,没学KMP之前,看到字符串的长度后.很难做出来。现在就已经可以一次过了,我想这便是成长。Fighting!

#include <stdio.h>
#include <string.h>
#define N 1000005
char t
,w
;
int nxt
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: