码迷,mamicode.com
首页 > 其他好文 > 详细

【POI每日题解 #3】 OKR-Periods of Words

时间:2018-06-16 17:00:56      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:pre   src   技术   color   col   return   img   closed   while   

题目链接

蒟蒻对kmp了解很浅

然鹅此题很裸

一个位置的i - next[i] 是它的“最小周期”

而“最大周期”就是一直向前找next

找到没有了

i - next[没有next的位置]就是该位置

记得每次要更新一下next 这样每次只用找前一个 实现O(1)的复杂度

总复杂度 O(n)

注:记得开long long哈 QAQ

技术分享图片
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 const int N = 1e6 + 5;
 5 int len; 
 6 char str[N];
 7 int next[N];
 8 int main(){
 9     scanf("%d%s", &len, str);
10     int k = 0;
11     for(int i = 1; i < len; i++){
12         while(k > 0 && str[k] != str[i]) k = next[k];
13         if(str[k] == str[i]) k++;
14         next[i + 1] = k;
15     }
16     long long ans = 0;
17     for(int i = 1; i <= len; i++){
18         if(next[next[i]]) next[i] = next[next[i]]; 
19         ans += (long long)(i - (next[i] ? next[i] : i));
20     }
21     printf("%lld", ans);
22     return 0;    
23 }
View Code

 

【POI每日题解 #3】 OKR-Periods of Words

标签:pre   src   技术   color   col   return   img   closed   while   

原文地址:https://www.cnblogs.com/hjmmm/p/9190728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!