【[POI2006]OKR-Periods of Words】
很妙的一道题
感觉又加深了对\(KMP\)还有\(next\)数组的理解
先来看看这个鬼畜的题意,大致就是给你一个字符串,对于这个字符串的每一个前缀,要去找到这个前缀的一个最长的前缀,使得前缀成为这个前缀的前缀倍长之后的前缀
很蛇皮的题意,之后可能就会懵逼了,这根\(KMP\)有什么关系
我们来考虑这样一张图

那个标这黑点的部分是这个前缀\(i\)的\(next[i]\),于是我们如果将这个红色的部分倍长,这个相等的前缀和后缀就可以卡到一起了,于是就满足了前缀成为这个前缀的前缀倍长之后的前缀的要求
但是这显然不能够满足最长的前缀这个要求
很显然这个红色的前缀长度为\(i-next[i]\),如果这个红色的部分更短想让红色部分更长一些的话我们就得让\(next[i]\)变小
怎么让\(next[i]\)变小呢,很显然我们多跳几次\(next\)就好了,直到我们跳\(next\)跳不动了,那么我们就找到了最短的相等前缀和后缀,这个时候红色部分就是最长的了
所以我们可以写一个暴力跳\(next\)的代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
#define maxn 1000005
#define LL long long
char S[maxn];
int nx[maxn];
int n;
LL ans;
int main()
{
scanf("%d",&n);
scanf("%s",S+1);
nx[0]=nx[1]=0;
for(re int i=2;i<=n;i++)
{
int p=nx[i-1];
while(p&&S[p+1]!=S[i]) p=nx[p];
if(S[i]==S[p+1]) nx[i]=p+1;
else nx[i]=0;
}
for(re int i=1;i<=n;i++)
{
int p=nx[i];
if(!p) continue;
while(nx[p]) p=nx[p];
ans+=i-p;
}
printf("%lld",ans);
return 0;
}
显然暴力跳\(next\)很容易被卡成\(O(N^2)\),我们得有一个更妙的方法来得到一个前缀的最短非空相等前缀后缀
于是我们设\(num[i]\)表示\(i\)这个前缀的最短相等前缀后缀的长度
于是答案就是\(\sum_{i=1}^ni-num[i]\)
对于这个\(num\)数组我们还是可以在求\(next\)的时候顺便求出来
如果一个\(i\)和某个位置\(p+1\)匹配上了,那么\(num[i]=num[p+1]\)显然\(i\)最后跳下去也就是\(num[p+1]\)得到的最短相等前缀后缀
如果没有匹配上\(num[i]=i\),\(num\)等于自己
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
#define maxn 1000005
#define LL long long
char S[maxn];
int nx[maxn],num[maxn];
int n;
LL ans;
int main()
{
scanf("%d",&n);
scanf("%s",S+1);
nx[0]=nx[1]=0;
num[1]=1;
for(re int i=2;i<=n;i++)
{
int p=nx[i-1];
while(p&&S[p+1]!=S[i]) p=nx[p];
if(S[i]==S[p+1]) nx[i]=p+1,num[i]=num[p+1];
else nx[i]=0,num[i]=i;
}
for(re int i=2;i<=n;i++)
ans+=(i-num[i]);
printf("%lld",ans);
return 0;
}
【[POI2006]OKR-Periods of Words】的更多相关文章
- 【英语魔法俱乐部——读书笔记】 2 中级句型-复句&合句(Complex Sentences、Compound Sentences)
[英语魔法俱乐部——读书笔记] 2 中级句型-复句&合句(Complex Sentences.Compound Sentences):(2.1)名词从句.(2.2)副词从句.(2.3)关系从句 ...
- 【PY从0到1】 一文掌握Pandas量化基础
# 2[PY从0到1] 一文掌握Pandas量化基础 # Numpy和pandas是什么关系呢? # 在我看来,np偏向于数据细节处理,pd更偏向于表格整体的处理. # 要记住的pd内部的数据结构采用 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 【Python五篇慢慢弹】数据结构看python
数据结构看python 作者:白宁超 2016年10月9日14:04:47 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc ...
- 【十大经典数据挖掘算法】PageRank
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...
- 【十大经典数据挖掘算法】EM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 极大似然 极大似然(Maxim ...
- 【十大经典数据挖掘算法】AdaBoost
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...
- 【十大经典数据挖掘算法】SVM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...
- 【bb平台刷课记】wireshark结合实例学抓包
[bb平台刷课记]wireshark结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...
随机推荐
- OutSystems学习笔记。
ew job and new software, new challenge as well. OutSystems这软件挺好上手的.虽然没有中文文档,但英文文档超级详细,堪称傻瓜版SOP 照着步骤写 ...
- 远程桌面下启动MATLAB时的License Manager Error -103错误
之前使用学校提供的正版lincense,是通过MATLAB 官网注册下载的MATLAB 2017a,远程登录可用打开.后来学校停止购买了,时间紧迫,网上下载了一个standalone的lincense ...
- js生成6位随机码
js生成6位随机数字: let chars = '0123456789'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/ let maxPos = chars.len ...
- 关于async和await的一些误区
微软的MSDN说async和await是“异步”,但是不少人(包括笔者自己)有一些误区需要澄清:为什么await语句之后没有执行?不是异步吗? [示例代码] public partial class ...
- springboot项目部署到独立tomcat的爬坑集锦
目录 集锦一:普通的springboot项目直接部署jar包 集锦二:springboot项目不能直接打war包部署 集锦三:因为tomcat版本问题导致的lombok插件报错:Invalid byt ...
- MySQL:ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
错误:ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) 原因 :登录帐户错误(ODB ...
- jquery echarts 饼状图
var myChart = echarts.init(document.getElementById('myChart')); option = { title : { text: '某站点用户访问来 ...
- 【转】spring boot使用Druid和监控配置
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012100371/article/details/76602612 Druid是Java语言中最好 ...
- 简单的maven项目
手动建立一个简单的maven项目,不使用eclipse 好吧,第一步:建立一个项目路径,比如在d盘新建一个mavenTest文件夹,在mavenTest文件夹中建立HelloMaven的文件夹,作为项 ...
- linux awk 使用的一个例子
1. 场景 从日志中获取漏发奖励的司机id 2. 日志 如下(需要获取一个时间段的 driverIdStr) ::-thread-] order.service.TOrderInfoServiceIm ...