POJ 3080 Blue Jeans

按照 CSGrandeur 的方法做的;

枚举第一个串的所有子串,并查找是否在其他串中出现,需要注意题目要求在最大长度前提下,输出字典序最小的串,这里也点小难,刚开始没看懂大侠的代码,后来试了几种控制方法,有的需要先把 cstr 清空,显得麻烦,才逐渐理解了;

# include <stdio.h>

# include <string.h>



# define N 65



int n;

char dic[15][N], cstr[N];



char find(void)

{

    char buf[N], ok;

    int len, i, j;



    cstr[0] = 0;

    for (len = 60; len > 2; --len)

    {

        for (j = 60-len; j >= 0; --j)

        {

            memcpy(buf, dic[0]+j, len);

            buf[len] = 0;

            if (strcmp(buf, cstr) < 0 || strlen(cstr) < len)

            {

                for (i = 1; i < n; ++i)

                    if (strstr(dic[i], buf) == NULL) break;

                if (i == n) strcpy(cstr, buf);

            }

        }

        if (strlen(cstr) == len) return 1;

    }

    return 0;

}



int main()

{

    int T, i;



    scanf("%d", &T);

    while (T--)

    {

        scanf("%d", &n);

        for(i = 0; i < n; ++i) scanf("%s", dic[i]);

        if (find()) puts(cstr);

        else puts("no significant commonalities");

    }



    return 0;

}

//

你可能感兴趣的:(poj)