HDU 5510 Bazinga 暴力匹配加剪枝

  思路: 标记每个字符串前面的子串,如果一个字符串a,前面一个是字符串b,b是a的子串,然后就继续往前找,找到字符串c,然后 发现字符串c被标记了,说明c是b的子串,那么c必是a的子串,也可以这样理解如果b是a的子串,那么b的所有子串(即b串前被标记了的字符串)都是a的子串。就这样剪枝。

#include<stdio.h>
#include<string.h>
using namespace std;
char s[505][2005];
int vis[505];
int main()
{
    int t;
    int icase=0;
    scanf("%d",&t);
    while(t--)
    {
        icase++;
        memset(vis,0,sizeof(vis));
        int n,ans=-1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s[i]);
            for(int j=i-1;j>=1;j--)
            {
                if(vis[j]) continue;
                if(strstr(s[i],s[j])==NULL) {ans=i;break;}
                else
                    vis[j]=1;
            }
        }
        printf("Case #%d: %d\n",icase,ans);
    }
    return 0;
}

 

posted @ 2018-08-06 15:24  eason99  阅读(59)  评论(0编辑  收藏  举报