zoukankan      html  css  js  c++  java
  • hdu 5510 Bazinga (KMP+暴力标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510

    思路:

    一开始直接用KMP莽了发,超时了,后面发现如果前面的字符串被后面的字符串包含,那么我们就不需要用前面的字符串去比较了,把他标记掉就好了。

    实现代码:

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    char s[505][2050];
    int vis[510];
    int next1[2050];
    int slen,tlen;
    void get_next(char *mat)
    {
        int j,k;
        tlen=strlen(mat);
        j=0;k=-1;next1[0]=-1;
        while(j<tlen)
        {
            if(k==-1||mat[j]==mat[k])
                next1[++j]=++k;
            else
                k=next1[k];
        }
    }
    int kmp_pos(char *str,char *mat)
    {
        int i=0,j=0;
        slen=strlen(str);
        get_next(mat);
        while(i<slen&&j<tlen)
        {
            if(j==-1||str[i]==mat[j])
            {
                i++;j++;
            }
            else
                j=next1[j];
        }
        if(j==tlen)
            return i-tlen;
        return -1;
    }
    int main()
    {
        int tt,n;
        int ttt=0;
        scanf("%d",&tt);
        while(tt--)
        {
            ttt++;
            int sum=-1;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%s",s[i]);
                vis[i] = 1;
            }
            int flag=0;
            int st = 1;
            for(int i = 2;i <= n;i ++){
                int ans=kmp_pos(s[i],s[i-1]);
                if(ans != -1)
                    vis[i-1] = 0;
            }
            for(int i=n;i>=1;i--)
            {
                flag=0;
                for(int j=i-1;j>=1;j--)
                {
                    if(vis[j]==0) continue;
                    int ans=kmp_pos(s[i],s[j]);
                    if(ans==-1)
                    {
                        flag=1;break;
                    }
                }
                if(flag==1)
                {
                    sum=i;break;
                }
            }
           printf("Case #%d: ",ttt);
           printf("%d
    ",sum);
        }
    }
  • 相关阅读:
    mongodb的账户管理
    mongo备份与恢复
    mongo索引
    聚合aggregate
    07-【jsp基本了解】
    Servlet登录小案例
    06-【servletconfig、servletContext 】
    05-【session、cookie】
    jQuery
    04-【servlet转发和重定向】
  • 原文地址:https://www.cnblogs.com/kls123/p/9783760.html
Copyright © 2011-2022 走看看