`

hdu 5510 Bazinga 思路详解 kmp +思维

    博客分类:
  • acm
 
阅读更多
来一发代码,先前后两两比较,如果前一个串是后一个串的字串,那他就是没必要的,假设第i个串是i+1的子串,如果在后面循环比较中,如果第i+1个串是后面串的子串,那i个串就没有比的必要了,如果第i+1不是后面串的子串,直接结束循环,查找结束,得出结果


#include <bits/stdc++.h>
int next[10005];
int T;
char s[505][2005];
bool v[550],flag;
void getnext(char str[],int len)
{
    int k=0;
    next[1]=0;
    for(int i=2;i<=len;i++)
    {
        while(k>0&&str[k+1]!=str[i])
            k=next[k];
        if(str[k+1]==str[i])
            k++;
        next[i]=k;
    }
}

int match(char P[],int lenp,char T[],int lent)
{
    int res=0;
    getnext(P,lenp);
    int k=0;
    for(int i=1;i<=lent;i++)
    {
        while(k>0&&P[k+1]!=T[i])
            k=next[k];
        if(P[k+1]==T[i])
            k++;
        if(k==lenp){
            res++;
            k=next[k];//这儿修改很重要,不然会超时
            return 1;
        }
    }
    return 0;
}
int main()
{
    scanf("%d",&T);
    int n;
    for(int cs = 1;cs<=T;cs++)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
           scanf("%s",s[i]+1);
        memset(v,true,sizeof(v));
        int sum = 0;
        for(int i=2;i<=n;i++)
        {
            int lent=strlen(s[i]+1);
            int lenp=strlen(s[i-1]+1);
            if(match(s[i-1],lenp,s[i],lent))
                v[i-1]=false;
        }
        printf("Case #%d: ",cs);
        flag = false;
        for(int i=n;i>=1&&!flag;i--)
        {
            for(int j=i-1;j>=1&&!flag;j--)
            {
                if(v[j])
                {
                    int lenw=strlen(s[j]+1);
                    int lent=strlen(s[i]+1);
                    int ans=match(s[j],lenw,s[i],lent);
                    if(ans==0)
                    {
                        printf("%d\n",i);
                        flag = true;
                        break;
                    }
                }

            }
        }
        if(!flag) printf("-1\n");
    }
    //system("pause");
    return 0;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics