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】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随风潜入夜润物细无声象征什么意思 随风潜
- 下一篇: 卡路里焦耳是什么关系 卡路里和焦耳怎么换