Substrings - HDU 1238(最大共同子串)

题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串)。
 
分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次遇到类似的题目我已经掌握高效的方法了。
==============================================================================
#include<stdio.h>
#include<string.h>

const int MAXN = 107;
const int oo = 1e9+7;
const int mod = 10007;

char s[MAXN][MAXN];
int next[MAXN];

void GetNext(char s[], int N)
{
    int i=0, j=-1;
    next[0] = -1;

    while(i < N)
    {
        if(j==-1 || s[i]==s[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}
bool KMP(char a[], char b[])
{
    int i=0, j=0;
    int Na = strlen(a);
    int Nb = strlen(b);

    GetNext(b, Nb);

    while(i < Na)
    {
        while(j==-1 || (a[i]==b[j] && i<Na))
            i++, j++;
        if(j == Nb)return true;

        j = next[j];
    }

    return false;
}
bool OK(char a[], char s[])
{
    if(KMP(a, s) == true)
        return true;
    strrev(s);

    return KMP(a, s);
}
int main()
{
    int T;

    scanf("%d", &T);

    while(T--)
    {
        int i, j, k, N, len=oo, ans=0;
        char a[MAXN];///保存最短的那个串

        scanf("%d", &N);

        for(i=1; i<=N; i++)
        {
            scanf("%s", s[i]);

            int M = strlen(s[i]);

            if(len > M)
            {
                len = M;
                strcpy(a, s[i]);
            }
        }

        for(i=1; i<=len; i++)
        for(j=0; i+j<=len; j++)
        {
            char b[MAXN] = {0};

            strncpy(b, a+j, i);

            for(k=1; k<=N; k++)
            {
                if(OK(s[k], b) == false)
                    break;
            }

            if(k > N)
                j=len, ans = i;
        }

        printf("%d\n", ans);
    }

    return 0;
}

 

posted @ 2015-08-15 17:07  无忧望月  阅读(215)  评论(0编辑  收藏  举报
levels of contents