hduCount the string——对kmp的next数组的理解和运用

题目链接

思路:

next数组,ne[i] = j,表示s[1, j] 和 s[i-j+1,i] 相等,即从i结尾长度为j的后缀和从1开始长度为j的前缀相等 (s字符串从1开始存储)
ans初始化为n,如果发现ne[i]>0,则ans++,再进行回溯,直到ne[i]==0

代码

#include<bits/stdc++.h>

using namespace std;
const int N = 2e5+9;
char s[N];
int  ne[N];
typedef long long ll;
const int mod = 10007;
int main()
{
   
    int t;
    cin>>t;
    while(t--)
    {
   
        int n;
        scanf("%d %s",&n,s+1);
        int ans = n;
        memset(ne,0,sizeof ne);
    for (int i = 2, j = 0; i <= n; i ++ )
{
   
    while (j && s[i] != s[j + 1]) j = ne[j];
    if (s[i] == s[j + 1]) j ++ ;
    ne[i] = j;
   // cout<<ne[i]<<endl;
}
        for(int i=2; i<=n;i++)
        {
   
            int t = ne[i];
            while(t)
            {
   
                ans = (ans+1 )%mod;
                t = ne[t];
            }
       }
       printf("%d\n",ans); 
}
return 0;
 } 
全部评论

相关推荐

2025-12-08 18:11
曲阜师范大学 Java
程序员花海_:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务