您的位置:首页 > 其它

HDU5510Bazinga(暴力剪枝)

2015-11-04 20:15 393 查看
题意:问是否存在最大的j在j之前的字符串中有一个不是j的子串,

思路,剪枝:如果一个串已经是某个串的子串,下次就可以不用再检查他了,还有一个,如果这个串前有比他长的串,那么就可以直接判断是ok的

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn=2005;
const int inf=1<<23;
char a[501][2005];
int len[2005];
bool vis[maxn];
int mxc[maxn];
int main(){
int T;
int cas=1;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",a[i]);
mxc[i]=len[i]=strlen(a[i]);
vis[i]=0;
}
len[0]=0;int mx=0;
for(int i=2;i<=n+1;i++){
if(mx<len[i-1])mx=len[i-1];
mxc[i]=mx;
}
//for(int i=1;i<=n;i++)printf("%d ",mxc[i]);
printf("Case #%d: ",cas++);
int flag=0;
for(int i=1;i<=n;i++){
if(mxc[i]>len[i]){
flag=i;continue;
}
for(int j=i-1;j>=1;j--){
if(vis[j]) continue;
if(strstr(a[i],a[j])==NULL){
flag=i;
}
else
vis[j]=1;
}
}
if(flag){
printf("%d\n",flag);
}
else {
printf("-1\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: