**
航电oj:Count the string
**
#题目描述
#要你用kmp算法来算一个串和它的子串的匹配次数
#最少有n个 子串本身也是一次 一共有n次 加上 子串之外的匹配次数
#知识点
kmp next数组意义
#代码
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
char simple[1000005];
int Next[1000005];
int n;
void find_next()
{
int i = 1,len = 0;
Next[0] = 0;
while(i < n)
{
if(simple[len] == simple[i])
{
Next[i] = len + 1;
i ++;
len ++;
}else
{
if(len > 0)
{
len = Next[len-1];//!!!
}
else
{
Next[i] = 0;
i++;
}
}
}
return ;
}
void next_move()
{
int i = n;
while(i >0)
{
Next[i] = Next[i-1];
i--;
}
Next[0] = -1;
return ;
}
int main()
{
int t;
cin >> t;
while(t--)
{
memset(simple,'/0',sizeof(simple));
memset(Next,0,sizeof(Next));
cin >> n >> simple;
//scanf("%s",&simple);
find_next();
next_move();
// for(int i=0;i<n;i++)
// {
// cout<< next[i] <<endl;
// }
int temp = 0;
long long ans= n + Next[n];
for(int i=1;i< n;i++)
{
if (Next[i] + 1 != Next[i + 1]) ///!!!! 不是递增的就是没有匹配上的 就把当前的加上 而不是一次一次加 因为后面的就已经包括前面的情况了
{
ans += Next[i];
}
}
cout << ans % 10007 <<endl;
}
return 0;
}
#总结
要熟练了才会写 多写写
kmp原理参考
https://www.bilibili.com/video/BV1Px411z7Yo?share_source=copy_web