zoukankan      html  css  js  c++  java
  • hdu3366 Count the string

    考虑dp[i]代表前缀s[1...i]出现的次数,必定有dp[nxt[i]] += dp[i]
    倒着推就是了

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    int T, n, nxt[200005], dp[200005], ans;
    const int mod=10007;
    char a[200005];
    void mknxt(){
        int k=0;
        for(int i=2; i<=n; i++){
            while(k && a[i]!=a[k+1])    k = nxt[k];
            if(a[i]==a[k+1])    nxt[i] = ++k;
        }
    }
    int main(){
        cin>>T;
        while(T--){
            ans = 0;
            scanf("%d", &n);
            scanf("%s", a+1);
            memset(nxt, 0, sizeof(nxt));
            for(int i=1; i<=n; i++)    dp[i] = 1;
            mknxt();
            for(int i=n; i>=1; i--)
                dp[nxt[i]] = (dp[nxt[i]] + dp[i]) % mod;
            for(int i=1; i<=n; i++)
                ans = (ans + dp[i]) % mod;
            printf("%d
    ", ans);
        }
        return 0;
    }
    
  • 相关阅读:
    NOI 题库 7084
    NOI 题库 7218
    POJ 2386 题解
    NOI 题库 8465
    NOI 题库 2753
    NOI 题库 1792
    P3709 大爷的字符串题
    初探莫队
    P1026 统计单词题解
    AC自动机小记
  • 原文地址:https://www.cnblogs.com/poorpool/p/7900012.html
Copyright © 2011-2022 走看看