美文网首页
HDU5510(Bazinga)

HDU5510(Bazinga)

作者: kimoyami | 来源:发表于2018-10-24 23:42 被阅读2次

链接: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;
}

相关文章

  • HDU5510(Bazinga)

    链接:https://vjudge.net/problem/HDU-5510思路:首先暴力匹配复杂度肯定不能接受,...

  • Bazinga,Bazinga!

    我和M对于电视剧很少有共同的爱好和话题,除了《生活大爆炸》。于是从第一季开始,每晚看两集《生活大爆炸》成了我们的睡...

  • Bazinga

    居然真tm有人点开。

  • bazinga

    小老鼠藏在柜子里磕磕磕磕的磨牙。 小猫咪循着声音悄咪咪的靠近。 小小的肉垫落在地上毫无声音,柔软的身体巧妙的绕过障...

  • Bazinga

    项目间通信用到DES 加密算法,在与对方调试接口时发现了一个 magic string :26ebaf15e64a...

  • #灰日梦# BAZINGA

  • "bite me"不是说“咬我”,真正的口语

    常看《生活大爆炸》的同学应该知道 Sheldon除了 “Bazinga”(逗你玩,气死你) 还有一句很经典的口头禅...

  • 《恋你十年,未曾改变》目录

    Bazinga! 各位简书的读者朋友们大家好!(超级兴奋脸)我是《恋十》的作者lemoney,最近有读者反映读了某...

  • 自我修炼第115天&Present.Cake项目第39天

    实践证明,叫醒一个人起来最好的方法不是梦想,而是饥饿。Bazinga! 很久没有更新过日志了,这段期间虽然过得平淡...

  • 《从简,从诗》|《临秋有怀》

    《临秋有怀》 文|耳朵式Bazinga 秋意初融雨蒙蒙 ,蝉声未起匿秋风 高云不见夕阳暮 ,且上青山作罩头 旧路仍...

网友评论

      本文标题:HDU5510(Bazinga)

      本文链接:https://www.haomeiwen.com/subject/alvftqtx.html