POJ 3080 Blue Jeans KMP+ 枚举

这道题我就不解释了,无非就是枚举取字串,然后kmp进行比较。
本来不大想贴着道题的。但是我很悲剧的是为了省事直接在上一道KMP上贴的代码,然后用了一个memset函数,我的pre数组开刀了一百万= =。
不过还是比较值得的,花了时间不少但是还是知道了memset是需要花费时间的。
View Code
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int pre[100];
void predeal(char s[])
{
    int len,i,j;
    len = strlen(s);
    pre[0] = -1;
    j = -1;
    for(i = 1;i < len;i++)
    {
        while(j > -1 && s[j+1] != s[i])
        j = pre[j];
        if(s[j+1] == s[i])
        j++;
        pre[i] = j;
    }
}
int kmp(char s1[],char s2[])
{
    predeal(s1);
    int len1,len2,i,j,num;
    len1 = strlen(s1);
    len2 = strlen(s2);
    num = 0;
    for(i = 0,j = -1;i < len2;i++)
    {
        while(j > -1 && s1[j+1] != s2[i])
        j = pre[j];
        if(s1[j+1] == s2[i])
        j++;
        if(j == len1-1)
        return 1;
    }
    return 0;
}
int main()
{
    int n,i,j,t,k,leap;
    char s[65][65],sub[65],ans[65],str[65];
    int Case = 0;
   // freopen("out.txt","r",stdin);
    scanf("%d",&t);
    while(t--)
    {
        leap = 0;
        scanf("%d%*c",&n);
        for(i = 0;i < n;i++)
        gets(s[i]);
        int len = strlen(s[0]);
        memset(ans,0,sizeof(ans));
        for(i = 3;i <= len;i++)
        {
            for(j = 0;j <= len-i;j++)
            {
                for(k = 0;k < i;k++)
                    sub[k] = s[0][j+k];
                sub[k] = '\0';
                memset(pre,0,sizeof(pre));
                for(k = 1;k < n;k++)
                {
                    if(kmp(sub,s[k]) == 0)
                    break;
                }
                if(k == n)
                {
                    if(ans[0] == '\0')
                    strcpy(ans,sub),leap = 1;
                    if(strlen(sub) > strlen(ans))
                    strcpy(ans,sub),leap =1;
                    if(i == strlen(ans)&& strcmp(ans,sub) > 0)
                    strcpy(ans,sub),leap = 1;
                }
            }


        }
        if(leap)
        printf("%s\n",ans);
        else
        printf("no significant commonalities\n");
    }


    return 0;
}
原文地址:https://www.cnblogs.com/0803yijia/p/2601608.html