HDU 5510 Bazinga 【kmp】

来源:互联网 发布:小众 视频编辑软件 编辑:程序博客网 时间:2024/06/05 10:51


点击打开链接


题意:


 给你n个串。问你满足一个串不完全包含前面的所有串的串的编号最大的串的编号是多少。



题解:


那就暴力匹配,从前往后枚举每个串,然后对于每个串,再从后往前挨个匹配。

如果包含前面的串,就直接覆盖,这样原串长度都不会很长,

另外匹配时候用kmp。


#include <bits/stdc++.h>#define ll long longusing namespace std;const int maxn=2020;int nxt[maxn];// 前缀函数,与多数教科书上略有不同这里是从0开始不是1开始void prefix(char s[], int*pre){    pre[0] = 0;    for(int i = 1, k = 0;s[i];++ i) {    while(k > 0 && s[k] != s[i]) k = pre[k-1];        if(s[k] == s[i]) ++ k;        pre[i] = k;    }}//x主串,y模式串int KMP(char* x, char * y){    //cout<<x<<" "<<y<<endl;    int m = strlen(y), j = 0, i;    int* pre = new int [m]; // 如有必要静态建立    prefix(y, pre); // 这里避免重复求统一串前缀    for(i = 0;x[i];++ i) {        while(j > 0 && y[j] != x[i]) j = pre[j - 1];        if(y[j] == x[i]) ++ j;        if(!y[j]) {            delete [] pre;            return 1;        }    }    delete [] pre;    return 0;}char a[505][maxn];int main(){    int t,len1,len2;    int n,cnt,ca=0,ans,f,j,q;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        char s[maxn];        ans=-1;        a[0][0]='9';a[0][1]='\0';        cnt=1,q=0;        for(int i=1;i<=n;++i){            if(++q>n) break;            scanf("%s",s);            if(i==1){strcpy(a[1],s);continue;}            j=cnt;            while(KMP(s,a[j])){                j--;            }            if(a[j][0]!='9')ans=i;            cnt=j+1;            strcpy(a[cnt],s);        }        printf("Case #%d: %d\n",++ca,ans);    }    return 0;}