简单kmp,将以第一个串的所有字串为模式串。已经做过,再做一次,复习下kmp.
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define N 1000005
#define INF 1000000007
#define M 100005
int n;
int next[105];
char a[104][104];
char sub[104];
int f[105];
void getnext(){
int len = strlen(sub);
int j = 0;
int k = - 1;
next[0] = -1;
while(j < len){
if(k == -1 || sub[j] == sub[k]){
j ++;
k ++;
if(sub[j] == sub[k])next[j] = next[k];
else next[j] = k;
}
else k = next[k];
}
}
int kmp(char *mstr){
int i = 0;
int j = 0;
if(!mstr || !sub || mstr[0] == 0 || sub[0] == 0)return -1;
getnext();
int len = strlen(sub);
while(mstr[i] != '\0' && j < len){
if(j == -1 || mstr[i] == sub[j]){
i++;
j++;
}
else j = next[j];
}
if(sub[j] == 0) return i - j;
else return -1;
}
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%s", a[i]);
}
int mxv = 0;
int la = strlen(a[0]);
for(int i = la - 1; i >= 0; i--){
for(int j = 0; j <= i; j++){
if(i - j + 1 <= mxv)continue;
memset(f, 0, sizeof(f));
for(int k = j; k <= i; k++){
sub[k - j] = a[0][k];
}
sub[i - j + 1] = 0;
for(int k = 1; k < n; k++){
if(kmp(a[k]) != -1)f[k] = 1;
}
for(int k = i; k >= j; k--){
sub[i - k] = a[0][k];
}
sub[i - j + 1] = 0;
for(int k = 1; k < n; k++){
if(kmp(a[k]) != -1)f[k] = 1;
}
int ss = 0;
for(int k = 1; k < n; k++){
ss += f[k];
}
if(ss == n - 1){
mxv = i - j + 1;
}
}
}
printf("%d\n", mxv);
}
return 0;
}