。。。

导航

hdu 2594 Simpsons’ Hidden Talents【kmp】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

题意:读入串1和串2,输出串2的前缀和串1的后缀最长公共部分和长度。

思路:将串1作为子串s2,串2作为主串s1,套用kmp.

#include<stdio.h>
#include<string.h>
#define N 50010
char s1[N],s2[N];
int next[N],l1,l2;

void get_next()
{
    int j,k;
    j = 0;
    next[0] = k = -1;
    while(j < l2)
    {
        if(k==-1||s2[j]==s2[k])
            next[++j] = ++k;
        else
            k = next[k];
    }
    return;
}
void kmp()
{
    int i,j,k;
    i = j = 0;
    while(i < l1)
    {
        if(j == -1||s1[i]==s2[j])
        {
            i++;
            j++;
        }
        else
            j = next[j];
    }
    if(!j)//当s1的后缀和s2前缀不匹配时 
        printf("0\n");
    else
    {
        for(k = 0; k < j; k ++)//j是能匹配到s2前缀的长度 
            printf("%c",s2[k]);
        printf(" %d\n",j);
    }
    return;
}

int main()
{
    while(scanf("%s %s",s2,s1)!=EOF)
    {//读入时,将第二行字符串作为主串,第一行字符作为子串 
        l1 = strlen(s1);
        l2 = strlen(s2);
        get_next();//建立next数组 
        kmp();//字符串前后缀匹配 
    }
    return 0;
}

 

posted on 2017-09-20 10:03  大学僧  阅读(102)  评论(0编辑  收藏  举报