HDU 5510 Bazinga 多种姿势

来源:互联网 发布:淘宝夜店装 编辑:程序博客网 时间:2024/05/20 05:59

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
45ababczabcabcdzabcd4youlovinyouaboutlovinyouallaboutlovinyou5dedefabcdabcdeabcdef3abaccc
 

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

Source
2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
 

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还快,如果有大佬看到这篇文章,或者你旁边有位大佬,求解答,感激不尽


原创粉丝点击