HDU3336(KMP)

来源:互联网 发布:公务员工资计算软件 编辑:程序博客网 时间:2024/06/05 07:43
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1e6+7;int s[maxn];//文本串char p[2000010];//匹配串int next[2000010];//匹配串的next数组void GetNext(int n){    int pLen = n;    next[0] = -1;    int k = -1;    int j = 0;    while (j < pLen)//坑点啊,模板是只求出了next[n-1],但是这题需要求next[n]。。。。。!!    {        //p[k]表示前缀,p[j]表示后缀        if (k == -1 || p[j] == p[k])        {            ++k;            ++j;            next[j] = k;        }        else        {            k = next[k];        }    }}int main(){    #ifdef xxz    freopen("in.txt","r",stdin);    #endif // xxz    int Case;    cin>>Case;    while(Case--)    {        int n,m;        cin>>n;        cin>>p;        int ans = 0;        GetNext(n);        for(int i = 1; i <= n; i++)        {                        if(next[i] > 0) ans++;            if(ans >= 10007) ans %= 10007;        }        ans += n;        ans %= 10007;        cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击