HDU5510(Bazinga)

链接:https://vjudge.net/problem/HDU-5510
思路:首先暴力匹配复杂度肯定不能接受,我们考虑如果对任意两个串用kmp可以把单词匹配复杂度降到O(len),这样整个复杂度就是O(tnn*len),这样还是会超时,我们考虑对于前面一个串如果是后面一个串的字串,那么我们只用跟后面那个串进行比较,这样一来因为只用求最大的下标位置,所以我们先预处理所有相邻串的关系,然后相邻串进行暴力kmp即可,这样可以减少大量的不必要运算,从而计算出结果。
代码:

#include<bits/stdc++.h>
using namespace std;
int t,n,cnt;


char str[510][2010];
int flag[510];
int f[2010];

void getfail(char *P){
    int m = strlen(P);
    f[0] = 0;
    f[1] = 0;
    for(int i=1;i<m;i++){
        int j = f[i];
        while(j&&P[i]!=P[j])j = f[j];
        f[i+1] = P[i] == P[j]?j+1:0;
    }
}

bool find(char *T,char *P){
    int n = strlen(T);
    int m = strlen(P);
    cnt = 0;
    memset(f,0,sizeof(f));
    getfail(P);
    int j = 0;
    for(int i=0;i<n;i++){
        while(j&&P[j]!=T[i])j = f[j];
        if(P[j]==T[i])j++;
        if(j==m)cnt++;
        if(cnt!=0)break;
    }
    return cnt;
}

int main(){
    int kase = 0;
    scanf("%d",&t);
    while(t--){
        memset(flag,0,sizeof(flag));
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%s",str[i]);
        for(int i=0;i<n-1;i++){
            if(find(str[i+1],str[i])!=0)//预处理所有的相邻串
             flag[i] = 1;
        }
        int fff = 0;
        for(int i=n-1;i>=0;i--){
            int ff = 0;
            for(int j=0;j<i;j++){
                if(flag[j])continue;
                find(str[i],str[j]);
                if(cnt==0){
                    printf("Case #%d: %d\n",++kase,i+1);
                    ff = 1;
                    break;
                }
            }
            if(ff){
                fff = 1;
                break;
            }
        }
        if(!fff)printf("Case #%d: %d\n",++kase,-1);
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先总结以下Java和C、C++中的一般控制台输入方式,方便以后的编程题: java键盘输入 java读文件(会自...
    androidjp阅读 2,327评论 0 16
  • KMP算法是数据结构与算法中串的经典算法案例,KMP是由三位学者同时发现(D.E.Knuth,J.H.Morris...
    陌言丶阅读 472评论 0 1
  • 引言 字符串匹配一直是计算机科学领域研究和应用的热门领域,算法的改进研究一直是一个十分困难的课题。作为字符串匹配中...
    潮汐行者阅读 1,689评论 2 6
  • 在一个寂静无声的夜里,只见两名黑衣人闯进了一座墓穴里。在一个死人身上左找右翻,好像 在找一样东西。突然,连续几道闪...
    祢豆子酱阅读 164评论 1 1
  • 我是白痴。这本书让我看了,印象很深。并且深深打动了我。 这本书讲了一个单纯男孩儿彭铁男的许多故事。他每天都很快...
    可乐不可可阅读 1,005评论 0 0