hdu5510_Bazinga_(剪枝+kmp)

来源:互联网 发布:ruby windows 编辑:程序博客网 时间:2024/06/04 19:09

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5510


题意:

给你t组数,每组n个串,让你找到最后一个串满足,在此串之前的串中有不是此串的子串。

解题思路:

这题呢,一开始用暴力做,过不了。。。

后来进行一个剪枝,判断第i个串之前的i-1个串中,存在的不是1-(i-1)的串中的子串是不是第i个串的子串,是的话标记掉,不是则更新结果为i。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>using namespace std;int a[505];int flag;int pl,sl;char p[505][2005];int next1[505];int sum;void get_next(int p1){    pl=strlen(p[p1]);    int k=-1,j=0;    next1[0]=-1;    while(j<pl)    {        if(k==-1||p[p1][j]==p[p1][k])        {            j++;k++;            next1[j]=k;        }        else        k=next1[k];    }}int KMP(int s,int p1){    sum=0;    sl=strlen(p[s]);    int i=0,j=0;    get_next(p1);    while(j<pl&&i<sl)    {            if(j==-1||p[s][i]==p[p1][j])            {                i++;j++;            }            else j=next1[j];            if(j==pl)            {                sum++;j=next1[j];            }    }    return sum;}int main(){    int t,n;    scanf("%d",&t);    int count=0;    while(t--)    {        sum=0;flag=-1;        memset(a,0,sizeof(a));        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%s",p[i]);        }        for(int i=0;i<n;i++)        {            for(int j=i-1;j>=0;j--)            {                if(a[j]==0)                {                    if(KMP(i,j)==0){                    flag=i+1;                    break;                    }                    else                    a[j]=1;                }            }        }           printf("Case #%d: %d\n",++count,flag);    }    return 0;}


原创粉丝点击