Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)
2024-10-21 15:34:43
题目链接: https://codeforces.com/contest/432/problem/D
题解:
做法一: KMP
显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大小。
做法二: 后缀数组/Z-box
按照height分组,二分查找即可。
这种题经常KMP和Z-box都能做。
另外哪位神犇教我一下扩展KMP和Z-box有啥区别。
代码
KMP:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<utility>
using namespace std;
const int N = 1e5;
char a[N+3];
int nxt[N+3];
int sz[N+3];
vector<pair<int,int> > ans;
int n;
void KMP()
{
nxt[0] = nxt[1] = 0;
for(int i=2; i<=n; i++)
{
nxt[i] = nxt[i-1];
while(nxt[i] && a[nxt[i]+1]!=a[i])
{
nxt[i] = nxt[nxt[i]];
}
if(a[nxt[i]+1]==a[i]) nxt[i]++;
}
}
int main()
{
scanf("%s",a+1); n = strlen(a+1);
for(int i=1; i<n+1-i; i++) swap(a[i],a[n+1-i]);
KMP();
for(int i=1; i<=n; i++) sz[i] = 1;
for(int i=n; i>=1; i--) sz[nxt[i]] += sz[i];
for(int i=n; i>0; i=nxt[i])
{
ans.push_back(make_pair(i,sz[i]));
}
printf("%d\n",ans.size());
for(int i=ans.size()-1; i>=0; i--) printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}
最新文章
- js的client详解
- noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T36——T45
- 最新《App Store审核指南》翻译
- Kafka的配置文件详细描述
- Javascript-XMLHttpRequest对象简介
- 求职(2015南京站获得百度、美的集团、趋势科技、华为offer)
- Linux学习之more命令
- iOS 如何自定义NavigationBar的高度
- Java程序猿面试题集(181- 199)
- 布局神器display:flex
- Java之List排序出错
- springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生
- SmartSql V3 重磅发布
- Tokyo Tyrant(TTServer)系列(一)-介绍和安装
- 07-部署Flanneld网络
- LoadRuner12.53教程(二)
- bootstrap 通过js代码创建和关闭插件
- shell黑名单
- Git查看与修改用户名、邮箱(转载)
- 【转】WebService 的创建,部署和使用
热门文章
- bookstrap form表单简单-smart-form
- NOI.AC #31. MST
- 【POJ 3263】 Tallest Cow
- 第二周 Leetcode 493. Reverse Pairs(HARD)
- SQL Server 数据字典生成脚本
- (function(){})();和(function(){}())每个括号的用途和区别
- CF1073C Vasya and Robot
- Android Jetpack - 使用 Navigation 管理页面跳转
- centos源更新
- c++ 四种类型转换机制