题意:
找到最大的i(1≤i≤n),存在一个整数j(1≤j<i),使得串sj不是si的子串,若不存在,输出“-1”
思路:
数据量 500 * 2000
AC自动机 ×
只能暴力匹配,但要剪枝
对于大量存在前后覆盖的串的数据,我们可以通过合并可覆盖的串减小数据范围。
例:
ab
abc
zabc
abcd
zabcd
合并后为:
zabc
zabcd
再从原串中以递减序和合并后的串逐个匹配。
对于不存在大量前后覆盖的串的数据,我们只能按照递减序直接暴力匹配。
由于数据水的缘故,常数小的暴力匹配也可以AC。
代码:
#include <bits/stdc++.h>
using namespace std;
int T,n;
char str[505][2005];
int p[2005],cnt;
int solve(){
for(int i=n;i>=1;i--){
for(int j=cnt;j>=1;j--){
if(i>=p[j]&&strstr(str[i],str[p[j]])==NULL) return i;
}
}
return -1;
}
int main()
{
scanf("%d",&T);
for(int Case=1;Case<=T;Case++){
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++) gets(str[i]);
cnt=1;
for(int i=1;i<=n;i++){
if(strstr(str[i],str[i-1])!=NULL){
p[cnt]=i;
}else{
p[++cnt]=i;
}
}
printf("Case #%d: %d\n",Case,solve());
}
}