HDU

来源:互联网 发布:js数组添加到指定位置 编辑:程序博客网 时间:2024/05/21 11:34

传送门
//题意: 问有多少个起点满足每次跳p个单位可以匹配下面那个子串.
//思路: 比较水的一个KMP变形. 每次我们跳k个单位进行kmp匹配就行了. 需要注意一点的但就是循环多少次了? 很显然的K次啊!!! 复杂度还是O(n+m)

AC Code

/** @Cain*/const int maxn = 1e6+5;int zc[maxn], pp[maxn];int Next[maxn];int n,m,cas=1;void getnext(int *s, int len) {    int t1 = 0, t2;    Next[0] = t2 = -1;    while(t1 < len){        if(t2 == -1 || s[t1] == s[t2])            Next[++t1] = ++t2;        else t2 = Next[t2];    }}int kmp(int *zc, int *pp, int len1, int len2,int flag,int strat) {    int i = strat ,t = 0;    int ans = 0;    while(i<len1){        while (t != -1 && zc[i] != pp[t]) t = Next[t];        i+=flag; t++;        if (t == len2) {            ans++;            t = Next[t];        }    }    return ans;}void solve(){    int k; Fill(Next,0);    scanf("%d%d%d",&n,&m,&k);    for(int i=0;i<n;i++) scanf("%d",&zc[i]);    for(int i=0;i<m;i++) scanf("%d",&pp[i]);    getnext(pp,m);    int ans = 0;    printf("Case #%d: ",cas++);    for(int i=0;i<k;i++){        ans += kmp(zc,pp,n,m,k,i);    }    printf("%d\n",ans);}
原创粉丝点击