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;
}

//

原文地址:https://www.cnblogs.com/JMDWQ/p/2582934.html