POJ 3080 Blue Jeans (KMP || 暴力)

题意:找n个串的长度>=3的公共子串

分析:

以第一个串为模板,枚举它的所有子串检查它是否为其他n-1个串

的子串,如果是则筛选长度最大且字典序最小的。

strncpy(s1,s,n) 函数作用是  将s指针所指位置开头的n个字符复制到s1字符串中。

strstr(s1,s2)判断s2是否为s1的子串,如果不是返回NULL,否则先确定s2在s1

的第一次出现的位置,并返回此s2在s1首位置的地址


暴力方法是用strstr来判断模式串是否为后n-1个串的子串。也可以用KMP算法判断。

其实可以不用找第一个串的所有子串,只找长度为3-n的后缀子串。


暴力:

#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

typedef long long ll;

char s[12][65],ans[65],t[65];

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]);
        int l = 0;
        for(int j=1;j<=60;j++){
            for(int st=0;st<60;st++){
                strncpy(t,s[1]+st,min(j,60-st+1));
                int flag = 0;
                for(int k=2;k<=n;k++){
                    if(strstr(s[k],t)==NULL){
                        flag=1;
                        break;
                    }
                }
                if(!flag)
                {
                    int len = strlen(t);
                    if(len>l){
                        l = len;
                        strcpy(ans,t);
                    }
                    else if(len==l && strcmp(ans,t)>0){
                        strcpy(ans,t);
                    }
                }
            }
        }
        if(l<3) printf("no significant commonalities\n");
        else printf("%s\n",ans);
    }
    return 0;
}

KMP:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps (1e-8)

using namespace std;

typedef long long ll;

char s[12][65],ans[65],t[65];
int f[65];
void getnext(char *x,int m)
{
    f[0]=0,f[1]=0;
    for(int i=1;il){
                        l = len;
                        strcpy(ans,t);
                    }
                    else if(len==l && strcmp(ans,t)>0){
                        strcpy(ans,t);
                    }
                }
            }
        }
        if(l<3) printf("no significant commonalities\n");
        else printf("%s\n",ans);
    }
    return 0;
}


你可能感兴趣的:(Data,Structure)