题意:在给出的所有串中找出一个长度大于三且字典序最小的最长模式串并输出,否则输出no significant commonalities。
思路:如果存在模式串,则该模式串可成功匹配到所有串,枚举出第一个串的全部子串作为模式串,与其他串进行匹配。
#include <cstdio>
#include <cstring>
using namespace std;
char s[15][65], p[65];
int next[65], lp, ls, flag;
void get_next(){
int i = 0,j = -1;
next[0] = -1;
while(i < lp)
{
if(j == -1 || p[i] == p[j]) next[++i] = ++j;
else j = next[j];
}
}
int kmp(int x){
lp = strlen(p), ls = 60;
get_next();
int i = 0, j = 0;
while(j < ls && i < lp){
if(i == -1 || p[i] == s[x][j]){
++i;
++j;
}
else{
i = next[i];
}
}
if(i == lp){
flag = 1;
return 1;
}
return 0;
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
getchar();
scanf("%s", s[i]);
}
flag = 0;
char ans[65];
strcpy(ans, "");
for(int i = 0; i < 60; ++i){
for(int j = 0; j < 60; ++j){
int cc = 0;
for(int k = i; k <= j; ++k){
p[cc++] = s[0][k];
}
p[cc] = '\0';
int h;
for(h = 1; h < n; ++h){
if(kmp(h));
else{
break;
}
}
if(h == n){
if(strlen(p) > strlen(ans)){
strcpy(ans, p);
}
else if(strlen(p) == strlen(ans)){
if(strcmp(p, ans) < 0){
strcpy(ans, p);
}
}
}
}
}
if(flag){
if(strlen(ans) >= 3){
printf("%s\n", ans);
}
else{
printf("no significant commonalities\n");
}
}
}
return 0;
}