1. 程式人生 > >KMP——hdu 3336 count the string

KMP——hdu 3336 count the string

miss calculate != cnblogs ber lar ota accep can

Count the string

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10478 Accepted Submission(s): 4893


Problem Description It is well known that AekdyCoin is good at string problems as well as number theory problems. When given a string s, we can write down all the non-empty prefixes of this string. For example:
s: "abab"
The prefixes are: "a", "ab", "aba", "abab"
For each prefix, we can count the times it matches in s. So we can see that prefix "a" matches twice, "ab" matches twice too, "aba" matches once, and "abab" matches once. Now you are asked to calculate the sum of the match times for all the prefixes. For "abab", it is 2 + 2 + 1 + 1 = 6.
The answer may be very large, so output the answer mod 10007.

Input The first line is a single integer T, indicating the number of test cases.
For each case, the first line is an integer n (1 <= n <= 200000), which is the length of string s. A line follows giving the string s. The characters in the strings are all lower-case letters.

Output For each case, output only one number: the sum of the match times for all the prefixes of s mod 10007.

Sample Input 1 4 abab

Sample Output 6 KMP算法中next數組的妙用 通過next數組的定義,我們可以知道next[j]=i表示以j結尾的最長前綴的終點位置為i。 用dp的思想考慮:每加一個字符會增加幾個前綴? 首先至少有一個從0到本身的前綴,然後根據next數組又得到已j為結尾的最長前綴的終點位置i 所以dp[j]=dp[next[i]]+1; dp[j]表示第j個字符加入時會增加幾個前綴。
#include <iostream>
#define mod 10007
using namespace std;
int l;
const int maxl= 200000+10;
char a[maxl];
int nextl[maxl];
int dp[maxl];
void get_next()
{
    nextl[0]=-1;
    for(int i=1;i<l;i++)
    {
        int j=nextl[i-1];
        while(a[j+1]!=a[i]&&j>-1)
            j=nextl[j];
        nextl[i]=(a[j+1]==a[i])?j+1:-1;
    }
}
void solve()
{
    get_next();
    dp[0]=1;
    int ans=1;
    for(int i=1;i<l;i++)
    {
        dp[i]=(nextl[i]>=0)?dp[nextl[i]]+1:1;
        ans=(ans+dp[i])%mod;
    }
    cout<<ans<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>l>>a;
        solve();
    }
    return 0;
}

  

KMP——hdu 3336 count the string