洛谷P3435 [POI2006]OKR-Periods of Words题解(KMP)
题目链接:https://www.luogu.com.cn/problem/P3435
洛谷P3435 [POI2006]OKR-Periods of Words
KMP
题意为求给定字符串所有前缀的最长真循环节长度之和。
fail函数的应用,给定字符串的最长真循环节长度即为字符串长度减去最短非空公共前后缀长度,先求出原字符串的fail函数值。再从1开始遍历,若fail[i]能够继续减小(即它不是最短的公共前后缀),就令当前位置j=fail[j],直到fail[j]==-1时j所在位置即为原字符串的最短公共前后缀,将fail[i]直接赋值,并继续往后遍历,由于前面步骤已经求出了fail[i]的最小值,后继步骤的循环查找次数不会过多(此处相当于记忆化搜索),最后遍历一遍所有前缀并加上对答案的贡献即可,但要注意特判最短公共前后缀长度为0的情况。
#include<bits/stdc++.h>
#define next next_
#define y1 yy
#define hash hash_
#define complex complex_
using namespace std;using ll=long long;
using ull=unsigned long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;const ll mod=1e9+7;
const double pi=acos(-1.0);
int _;ll n,fail[1000010];
string s;void getfail(string s){ll len=s.size();fail[0]=-1;ll i,j;for(j=1;j<len;j++)for(i=fail[j-1];;i=fail[i]){if(s[j]==s[i+1]){fail[j]=i+1;break;}else if(i==-1){fail[j]=-1;break;}}
}void work(){cin>>n>>s;getfail(s);for(ll i=1;i<n;i++){ll j=i;while(fail[j]!=-1) j=fail[j];if(fail[i]!=-1) fail[i]=j;}ll ans=0;for(ll i=0;i<n;i++){if(fail[i]==-1) continue;ans+=(i+1)-fail[i]-1;}printf("%lld",ans);
}int main(){// scanf("%d",&_);_=1;while(_--){work();}return 0;
}
洛谷P3435 [POI2006]OKR-Periods of Words题解(KMP)相关推荐
- 【题解】洛谷P3435 [POI2006] OKR-Periods of Words(KMP)
洛谷P3435:https://www.luogu.org/problemnew/show/P3435 思路 来自Kamijoulndex大佬的解释 先把题面转成人话: 对于给定串的每个前缀i,求最长 ...
- 洛谷P2851 [USACO06DEC]The Fewest Coins G 题解
洛谷P2851 [USACO06DEC]The Fewest Coins G 题解 题目链接:P2851 [USACO06DEC]The Fewest Coins G 题意: Farmer John ...
- 洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛 题解
洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛 题解 题目链接:P4799 [CEOI2015 Day2] 世界冰球锦标赛 题意: 译自 CEOI2015 Day2 T1「Ice Ho ...
- 洛谷P4390 [BOI2007]Mokia 摩基亚 题解
洛谷P4390 [BOI2007]Mokia 摩基亚 题解 题目链接:P4390 [BOI2007]Mokia 摩基亚 题意:摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和 ...
- BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- 洛谷-DFS-1019-单词接龙-个人AC题解和公共AC题解笔记
学习内容: 预处理 万能头文件 string的使用 话不多说,直奔主题 本人AC代码 #include<iostream> #include<cstdio> #include& ...
- 洛谷P3755 [CQOI2017]老C的任务 题解
题目传送门 题目描述 老C是个程序员. 最近老C从老板那里接到了一个任务--给城市中的手机基站写个管理系统.作为经验丰富的程序员,老C轻松地完成了系统的大部分功能,并把其中一个功能交给你来实现. 由于 ...
- [洛谷]CON1466 洛谷2017春节联欢赛 Hello Dingyou题解 Bzoj4763雪辉
题目来源:https://www.luogu.org/contest/show?tid=1466 创建时间:2017/3/13 18:33 镇楼图: 猜猜她是谁~ 解题思路: 春节居然也有 ...
- 洛谷P1424 小鱼的航程(改进版)-c++题解
小鱼的航程(改进版) - 洛谷 解题思路:周一到周五游泳,六日休息 输入周几(x)开始和经过了几(n)天,所以我们可以对输入的x一直自加n次,如果x在周一到周五则游泳的天数也自加,超过7天时对x取余7 ...
- 《GMOJ-Senior-5449 Pacifist》/《洛谷-CF763C / CodeForces-763-C Timofey and remoduling》题解
题目大意 给出一个长度为 n n n的元素两两不同的序列和一个质数 m m m.若该序列是由一个等差数列在模 m m m意义下打乱而得到的,请尝试求出原数列的首项和公差.若可能的原数列不唯一,请随便输 ...
最新文章
- 走错路也要美美的!富有创意的404页面设计灵感
- python判定串口已连接_python 自动识别并连接串口的实现
- 知识图谱|各生命周期主流算法 实践
- redis使用sysc超时_优雅的处理Redis访问超时
- 第二个结对编程——UI设计
- ASP.NET中操作SQL数据库
- 【POJ3784】【对顶堆 — 动态维护中位数】Running Media
- android 反编译jar包
- 地图导航定位二维码如何制作呢?
- 分享超好用的截动图工具ScreenToGif
- 文件夹有个蓝色箭头_带有双蓝色箭头的Windows文件夹图标是什么意思?
- 网站项目计划书模板范本
- 二叉树的前序遍历,中序遍历,后序遍历
- 网络爬虫学习第一弹:urllib库使用
- dnf服务器合并信息,DNF拍卖场系统开放:使徒合区服务器,公共频道物品交易功能...
- 新闻列表案例(前端html,css)
- 谈谈用例模型的那些事儿 之 注意什么
- 一次排查线上线程池数量过高的报警经历
- BB10 Cascades Hello World样例分析
- 软件项目管理——项目的成本管理