0
点赞
收藏
分享

微信扫一扫

hdu2594 简单KMP

题意:
     给你两个串,问你s1的前缀和s2的后缀最长公共部分是多少。
思路:

     根据KMP的匹配形式,我们求出s1的next,然后用s1去匹配s2,输出当匹配到s2的最后一个的时候的匹配位置就行了。



#include<stdio.h>
#include<string.h>

#define N 50000 + 10

char stra[N] ,strb[N];
int next[N];

void get_next(int m)
{
int j ,k;
j = 0 ,k = -1;
next[0] = -1;
while(j < m)
{
if(k == -1 || strb[j] == strb[k])
next[++j] = ++k;
else k = next[k];
}
}

int KMP(int n ,int m)
{
int max = 0;
int i ,j;
for(i = j = 0 ;i < n ;)
{
if(stra[i] == strb[j])
{
i ++ ,j ++;
}
else
{
j = next[j];
if(j == -1)
{
j = 0;
i ++;
}
}
}
return j;
}

int main ()
{
int n ,m;
while(~scanf("%s %s" ,strb ,stra))
{
n = strlen(stra);
m = strlen(strb);
get_next(m);
int ans = KMP(n ,m);
if(!ans) printf("0\n");
else printf("%s %d\n" ,stra + n - ans ,ans);

}
return 0;
}





举报

相关推荐

0 条评论