思路:
没什么好说的。
AC代码:
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
char s[505][2200];
int vis[3000];
int nex[505][2200];
void getnext(char *a,int j){
int k = 0;
for(int i = 1;a[i];i++){
while(a[i] != a[k] && k != 0){
k = nex[j][k-1];
}
if(a[i] == a[k]){
k++;
}
nex[j][i] = k;
}
}
inline int kmp(char *a,int po,char *b){ // a 小 b大 , return 1 代表a非b子串
int lena = strlen(a);
int lenb = strlen(b);
if(lena > lenb){
return 1;
}
int k = 0;
for(int i = 0;b[i];i++){
while(b[i] != a[k] && k != 0){
k = nex[po][k-1];
}
if(b[i] == a[k]){
k++;
if(k == lena){
return 0;
}
}
}
return 1;
}
int main()
{
int t;
cin>>t;
int n;
int cas = 0;
while(t--){
cas++;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%s",s[i]);
getnext(s[i],i);
}
int ans = 0;
memset(vis,0,sizeof(vis));
for(int i = 1; i<= n; i++){
for(int j = 1; j < i; j++){
if(vis[j])continue; // 小剪枝
if((kmp(s[j],j,s[i])) == 0){
vis[j] = 1;
}
else{
ans = i;
}
}
}
if(ans == 0)
ans = -1;
printf("Case #%d: %d\n",cas,ans);
}
return 0;
}