nssl1217-So many prefix?【KMP】
生活随笔
收集整理的这篇文章主要介绍了
nssl1217-So many prefix?【KMP】
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
正题
题目大意
求长度为偶数的前缀在字符串SSS中出现的次数和。
解题思路
我们先不考虑长度为偶数的话,答案很好求。先求出KMP的next数组,然后numi=numnexti+1num_i=num_{next_i}+1numi=numnexti+1。
之后num的和就是答案。
注:num数组表示前i个字符的前缀等于后缀的个数
之后我们考虑长度为偶数,对于每个numnumnum的+1+1+1操作,我们发现这个+1+1+1是对于一个新的iii来说的,那么改成只有iii是偶数才加一就好了。
code
#include<cstdio> #include<cstring> #define N 200010 using namespace std; char s[N]; int n,next[N],j,num[N],ans; int main() {scanf("%s",s);n=strlen(s);for(int i=1;i<n;i++)//计算next{while(j&&s[i]!=s[j]) j=next[j];j+=(s[i]==s[j]);next[i+1]=j;}for(int i=1;i<=n;i++)//计算num{if(i%2==0) num[i]++,ans++;//偶数+1 get√num[i]+=num[next[i]];ans+=num[next[i]];}printf("%d",ans); }总结
以上是生活随笔为你收集整理的nssl1217-So many prefix?【KMP】的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 随风潜入夜润物细无声象征什么意思 随风潜
- 下一篇: nssl1218-TRAVEL【SPFA