zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    区块链|学习笔记(三)
    左神算法之获取栈中最小值
    23种设计模式之适配器模式
    二叉树序列化和反序列化
    归并排序
    通过集合构建RDD或者DataFrame
    内核源码分析——shuffle
    问题
    函数参数
    问题记录
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2601608.html
Copyright © 2011-2022 走看看