拓展kmp的应用
Smiling & Weeping
---- 我与月亮,进行了一次深夜谈话
它与我谈论太阳,而我与它谈论你。
题目链接:P3435 [POI2006] OKR-Periods of Words - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:其实也就是kmp拓展,求s与s的每个后缀的LCP(最长公共前缀),但是这样超时,需要一个小小的优化(记录跳转即step[k],跳到可以上一个可以实现的地方,尽量保持复杂度在线性),同时s[i] == s[0]时,直接使ans += i;
Talk is cheap , show me the code
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n , Next[1000100] , step[1000100];
4 char str[1000100];
5 void getNext(char *c){
6 int len = strlen(c);
7 int p = 0 , k = 1 , l;
8 Next[0] = len;
9 while(p+1 < len && c[p] == c[p+1]) p++;
10 Next[1] = p;
11 for(int i = 2; i < len; i++){
12 p = k+Next[k]-1;
13 l = Next[i-k];
14 if(i+l <= p) Next[i] = l;
15 else{
16 int j = max(0 , p-i+1);
17 while(i+j < len && c[i+j] == c[j]) j++;
18 Next[i] = j;
19 k = i;
20 }
21 }
22 }
23 int main()
24 {
25 long long ans = 0;
26 int q=0 , k; // q代表周期,k代表最远到达的距离
27 scanf("%d",&n); scanf("%s",str);
28 getNext(str);
29 for(int i = 1; i < n; i++){
30 if(str[i] == str[0]){
31 ans += i;
32 } else {
33 int r = i-1 , tem = r;
34 while(Next[r] < i-r+1 && r >= (i+1)/2){
35 if(step[r] && step[r] < r) // 警惕bug,可能有step[r]==r,陷入死循环
36 r = step[r];
37 else r--;
38 }
39 if(r >= (i+1)/2 && Next[r] >= i-r+1) ans += r;
40 step[tem] = r;
41 }
42 }
43 printf("%lld\n",ans);
44 return 0;
45 }
一棵树,一块岩石,一朵云
文章到此结束,我们下次再见
拓展kmp的应用的更多相关文章
- hdu-4300(kmp或者拓展kmp)
题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然 ...
- hdu-4763(kmp+拓展kmp)
题意:给你一个串,问你满足最大字串既是前后缀,也在字符串除去前后缀的位置中出现过: 思路:我用的是拓展kmp求的前后缀,只用kmp也能解,在字符串2/3的位置后开始遍历,如果用一个maxx保存前2/3 ...
- poj-2752(拓展kmp)
题意:求一个串所有的前后缀字串: 解题思路:kmp和拓展kmp都行,个人感觉拓展kmp更裸一点: 拓展kmp: #include<iostream> #include<algorit ...
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
- HDU 3613 Best Reward(拓展KMP算法求解)
题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...
- 拓展KMP算法详解
拓展KMP解决的问题是给两个串S和T,长度分别是n和m,求S的每一个后缀子串与T的最长公共前缀分别是多少,记作extend数组,也就是说extend[i]表示S[i,n-1](i从0开始)和T的最长公 ...
- KMP&拓展KMP
KMP算法 说明 KMP算法是一种比较高效的字符串匹配算法,可以在线性时间内求出一个串在另一个串的所有匹配位置. 解析 详解KMP 设模板串是 \(pattern\) 令 \(next[i] = ma ...
- Period II FZU - 1901(拓展kmp)
拓展kmp板题 emm...我比较懒 最后一个字母进了vector两个1 不想改了...就加了个去重... 哈哈 #include <iostream> #include <cst ...
- Simpsons’ Hidden Talents HDU - 2594(拓展kmp)
Sample Input clinton homer riemann marjorie Sample Output 0 rie 3 看输出才题意...拓展kmp特征很明显嘛....注意开始就匹配到尾的 ...
- Seek the Name, Seek the Fame POJ - 2752(拓展kmp || kmp)
题意: 就是求前缀和后缀相同的那个子串的长度 然后从小到大输出 解析: emm...网上都用kmp...我..用拓展kmp做的 这就是拓展kmp板题嘛... 求出extend数组后 把exten ...
随机推荐
- nginx发布vue 项目
在本次使用nginx发布vue项目遇到 配置location 始终404 和 在项目子目录点击浏览器刷新出现404问题 使用nginx发布vue项目,为了方便测试就下载了一个nginx 放置自己目录下 ...
- 详解JS的Object.assign()
Object.assign() 通过复制一个或多个对象来创建一个新的对象. 语法 Object.assign(target, ...sources) 描述 如果目标对象中的属性具有相同的键,则属性将被 ...
- 密码暴力破解工具——九头蛇(hydra)使用详解及实战
转载出处:https://zhuanlan.zhihu.com/p/540998739 二.使用方法 语法:Hydra 参数 IP 服务 参数: -l login 小写,指定用户名进行破解 -L fi ...
- 代码随想录算法训练营Day24 回溯算法| 理论基础 77. 组合
代码随想录算法训练营 回溯 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式. 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯. 回溯是递归的副 ...
- 如何在前端应用中合并多个 Excel 工作簿
本文由葡萄城技术团队于博客园原创并首发.葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言|问题背景 SpreadJS是纯前端的电子表格控件,可以轻松加载 Excel 工作簿中的数据 ...
- 瞄准程序员招聘痛点,ShowMeBug让面试代码操作可“回放”
程序员虽然是建设互联网的职业之一,但他们的招聘工作的线上化却有不少难题. 疫情加速了市场对远程办公.远程面试.远程教学等模式的接受程度,但程序员招聘涉及到代码能力测试,甚至不同企业有不同的产品代码基础 ...
- 【Python&RS】GDAL批量裁剪遥感影像/栅格数据
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式.它 ...
- 【Python&GIS】通过经纬度创建矢量点文件
最近在做项目时,需要判断某个点是否在感兴趣区内.所以需要使用Python先根据经纬度的点创建矢量文件,再通过点文件和面文件的位置关系判断点是否在面内. 这里我们使用osgeo ...
- Python modbus_tk 库源码分析
modbus_tk 源代码分析 前言 modbus_tcp 协议是工业项目中常见的一种基于 TCP/IP 协议的设备数据交互协议. 作为 TCP/IP 协议的上层协议,modbus_tcp 协议涉及到 ...
- 计算机视觉重磅会议VAlSE2023召开,合合信息分享智能文档处理技术前沿进展
近期,2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE) 圆满落幕.会议由中国人工智能学会.中国图象图形学学会主办,江南大学和无锡国家高新技 ...