HDU 5510 Bazinga (KMP)

来源:互联网 发布:如何收藏淘宝店铺 编辑:程序博客网 时间:2024/05/18 04:36

题意:

       找到最大的i(1≤i≤n),存在一个整数j(1≤j<i),使得串sj不是si的子串,若不存在,输出“-1”

思路:

        数据量 500 * 2000 
        AC自动机 ×
        只能暴力匹配,但要剪枝

        对于大量存在前后覆盖的串的数据,我们可以通过合并可覆盖的串减小数据范围。
        例:
        ab
        abc
        zabc
        abcd
        zabcd
        合并后为:
        zabc
        zabcd
        再从原串中以递减序和合并后的串逐个匹配。

        对于不存在大量前后覆盖的串的数据,我们只能按照递减序直接暴力匹配。
        由于数据水的缘故,常数小的暴力匹配也可以AC。

代码:

#include <bits/stdc++.h>using namespace std;int T,n;char str[505][2005];int p[2005],cnt;int solve(){    for(int i=n;i>=1;i--){        for(int j=cnt;j>=1;j--){            if(i>=p[j]&&strstr(str[i],str[p[j]])==NULL) return i;        }    }    return -1;}int main(){    scanf("%d",&T);    for(int Case=1;Case<=T;Case++){        scanf("%d",&n);        getchar();        for(int i=1;i<=n;i++) gets(str[i]);        cnt=1;        for(int i=1;i<=n;i++){            if(strstr(str[i],str[i-1])!=NULL){                p[cnt]=i;            }else{                p[++cnt]=i;            }        }        printf("Case #%d: %d\n",Case,solve());    }}