题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336
题目大意:
给一个字符串,问所有的前缀在字符串中的匹配总和,对10007取模。比如abab,a匹配两次,ab匹配两次,aba匹配一次,abab匹配一次,所以总共是6次。
这题用KMP的Next数组来求:
对于Next[i]来说,如果其值不为零,说明有一个前缀和当前这个子串能匹配,所以把ans++就可以了。
AC代码:
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_N = 500001;
int Next[MAX_N];
void GetNext(char *p)
{
int k = -1, j = 0;
int len = strlen(p);
Next[0] = -1;
while (j < len)
{
if (k == -1 || p[j] == p[k])
{
k++;
j++;
Next[j] = k;
}
else
{
k = Next[k];
}
}
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
int n;
char s[MAX_N];
cin >> n >> s;
GetNext(s);
int ans = n%10007;
for (int i=1; i<=n; i++)
{
if (Next[i] != 0)
{
ans+=1;
ans%=10007;
}
}
cout << ans << endl;
}
return 0;
}