HDU 5510 Bazinga 多种姿势

Bazinga

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4910    Accepted Submission(s): 1543


Problem Description
Ladies and gentlemen, please sit up straight.
Don't tilt your head. I'm serious.

For  n  given strings  S1,S2,,Sn , labelled from  1  to  n , you should find the largest  i (1in)  such that there exists an integer  j (1j<i)  and  Sj  is not a substring of  Si .

A substring of a string  Si  is another string that occurs  in  Si . For example, ``ruiz" is a substring of ``ruizhang", and ``rzhang" is not a substring of ``ruizhang".
 

Input
The first line contains an integer  t (1t50)  which is the number of test cases.
For each test case, the first line is the positive integer  n (1n500)  and in the following  n  lines list are the strings  S1,S2,,Sn .
All strings are given in lower-case letters and strings are no longer than  2000  letters.
 

Output
For each test case, output the largest label you get. If it does not exist, output  1 .
 

Sample Input
  
  
4 5 ab abc zabc abcd zabcd 4 you lovinyou aboutlovinyou allaboutlovinyou 5 de def abcd abcde abcdef 3 a ba ccc
 

Sample Output
  
  
Case #1: 4 Case #2: -1 Case #3: 4 Case #4: 3
 

Source
 

Recommend
wange2014   |   We have carefully selected several similar problems for you:   6216  6215  6214  6213  6212 


这个题比较好玩啊,感觉题意和图片没啥关系,可能是用来活动气氛的把,题意就是让你找到第i个字符串,他位置前面的字符串有一个不是他子串的字符串。

思路:已第i个串为基地,去找,如果他是他后面某一个串的子串,那么就break掉就可以了,否则,他后面的这个串就有可能是最后解,用max取一下最优

my ugly code(KMP匹配)

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;
int t,n;
char a[521][2017];
int cas=1;
int e[521];

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

int kmp(char *t,char *p,int *f){
    int n=strlen(t),m=strlen(p);
    getfail(p,f);
    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){
            return 1;
        }
    }

    return -1;
}

int main(){

    int f[2017];

    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int max_len=0;
        for(int i=1;i<=n;i++){
            scanf("%s",a[i]);
        }
        for(int i=0;i<=n;i++)
            e[i]=1;
        int ans=-1,flag;
        for(int i=1;i<n;i++){
            for(int j=i+1;j<=n;j++){
                if(e[j]){
                    int tmp=kmp(a[j],a[i],f);
                    if( tmp == 1){
                        break ;
                    }
                    else{
                        e[j]=0;
                        ans=max(ans,j);
                    }
                }
            }
        }
        printf("Case #%d: %d\n",cas++,ans);

    }

    return 0;
}

my ugly code(strstr()匹配)


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;
int t,n;
char a[521][2017];
int cas=1;
int e[521];

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

int kmp(char *t,char *p,int *f){
    int n=strlen(t),m=strlen(p);
    getfail(p,f);
    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){
            return 1;
        }
    }

    return -1;
}

int main(){

    int f[2017];

    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int max_len=0;
        for(int i=1;i<=n;i++){
            scanf("%s",a[i]);
        }
        for(int i=0;i<=n;i++)
            e[i]=1;
        int ans=-1,flag;
        for(int i=1;i<n;i++){
            for(int j=i+1;j<=n;j++){
                if(e[j]){

                    if( strstr(a[j],a[i]) ){
                        break ;
                    }
                    else{
                        e[j]=0;
                        ans=max(ans,j);
                    }
                }
            }
        }
        printf("Case #%d: %d\n",cas++,ans);

    }

    return 0;
}


这里有个东西不明白,为什么strstr()函数比kmp还快,如果有大佬看到这篇文章,或者你旁边有位大佬,求解答,感激不尽


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值