**
航电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
该博客主要探讨如何运用KMP算法解决计算一个字符串与其子串匹配次数的问题。文章通过实例展示了KMP算法的实现,包括`find_next`和`next_move`两个关键函数,并提供了完整的C++代码。博主提醒读者需要对KMP算法的next数组有深入理解,并建议多练习以熟悉算法。此外,还提供了一个在线视频资源作为KMP算法的参考学习资料。

被折叠的 条评论
为什么被折叠?



