P3435-[POI2006]OKR-Periods of Words【KMP】
生活随笔
收集整理的這篇文章主要介紹了
P3435-[POI2006]OKR-Periods of Words【KMP】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
評測記錄:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3435
大意
一個字符串,對于每個前綴,求復制一份放在末尾可以覆蓋整個前綴的前綴,求所有的長度和。
解題思路
這道題如果暴力的話很簡單,對于每個前綴每次往前跳,如果不可以覆蓋了就下一個。
但是這樣會被卡成O(n2)O(n2)
所有我們可以加一個優化,我們找一個最短的,然后總長度減去最短的就是最長的。我們就可以每次改變next的值,讓他直接指向最短的,然后就可以O(n)O(n)解決問題
code
#include<cstdio> using namespace std; int n,next[1000011]; char s[1000011]; long long ans; int main() {scanf("%d",&n);scanf("%s",s);for(int i=1,j=0;i<n;i++){while(j&&(s[i]!=s[j])) j=next[j];j+=(s[i]==s[j]);next[i+1]=j;}//匹配指針int j;for(int i=1;i<=n;i++){j=i;while(next[j]) j=next[j];//跳轉if(next[i]!=0)next[i]=j;//記憶化ans+=i-j;//統計答案}printf("%lld",ans); }總結
以上是生活随笔為你收集整理的P3435-[POI2006]OKR-Periods of Words【KMP】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远上寒山石径斜的意思是什么 诗句远上寒山
- 下一篇: 电脑每次启动都要按f1 电脑每次开机都要