标签:
题目链接:HDU3336
1 4 abab
6
题目分析:KMP+DP,首先求出s的next数组,这里next数组应该只能使用未优化的标准求法,因为这里nexts数组储存的是最长的公共前缀与后缀,我们设一个数组dp,dp[i]代表以i结尾的字符串与前缀相同的子串的个数,比如题目中abab对应的dp数组应为1122,其中aba包含a和aba,abab包含abab和ab。具体递推公式为dp[i]=dp[nexts[i]]+1,然后这题的答案就是把dp数组中的所有数加起来了。
//
// main.cpp
// HDU3336(1)
//
// Created by teddywang on 16/5/4.
// Copyright © 2016年 teddywang. All rights reserved.
//
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N,n,nexts[200010],sum,dp[200010];
char s[200010];
void getnext()
{
int i=0,j=-1;
nexts[0]=-1;
while(i<n)
{
if(j==-1||s[i]==s[j])
{
nexts[++i]=++j;
dp[i]=dp[nexts[i]]+1;
}
else j=nexts[j];
}
}
int main()
{
cin>>N;
while(N--)
{
cin>>n;
scanf("%s",s);
getnext();
sum=0;
for(int i=1;i<=n;i++)
{
sum+=dp[i];
sum%=10007;
}
printf("%d\n",sum);
}
}
标签:
原文地址:http://blog.csdn.net/qq_29480875/article/details/51335555