HDU5510Bazinga(暴力剪枝)

来源:互联网 发布:农村淘宝政府如何补贴 编辑:程序博客网 时间:2024/06/01 08:24

题意:问是否存在最大的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;}
0 0
原创粉丝点击