【[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结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...
随机推荐
- sublime text 3 PHP 所需插件
1. PHP代码语法验证插件:SublimeLinter 2.Bracket Highlighter 用于匹配括号,引号和html标签.对于很长的代码很有用.安装好之后,不需要设置插件会自动生效 3. ...
- ios audio不能自动播放
今天做了一个简单的落地页项目,就是类似于手机微信上经常看到的滑动效果.因为公司要求需要自己开发,所以我就用swiper+swiper.animate开发,开发速度很快,只不过最后音乐哪里出现了一点小b ...
- 自动收缩数据库T-SQL
alter database 数据库名 set auto_update_statistics off alter database 数据库名 set auto_update_statistics on
- redis(3)发布订阅
一.发布/订阅模式 在软件工程里面,发布/订阅是一种消息模式,这种模式旨在将消息发送者和消息接收者解耦.发送者不需要关心将消息发送给谁,接收者也不需要知道消息的发送者是谁.发送者将消息发布以后就结束动 ...
- 十、集成使用redis
一.简介 redis是一种非关系型数据库,它的数据结构是key-value的存储形式:能够支持多种类型的数据存储,如:string/list/map/object...等.springboot自然也对 ...
- hibernate cascade的真正含义
hibernate cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的属性,表示级联操作. /** * (Optional) The o ...
- 快速搭建maven私服 Artifactory on Docker
1.下载官方镜像 docker pull docker.bintray.io/jfrog/artifactory-oss:latest 2.启动容器 docker run --name artifac ...
- 执行shell脚本报错:syntax error near unexpected token `或syntax error: unexpected end of file
引起此问题最可能的原因是: 在windows下编写的文件上传到linux执行. 我是在notepad++上编写的代码,之后上传到linux执行,报此错误.仔细检查,语法方面没有错误.上网查了一下,发现 ...
- 解决Openwrt安装插件提示一下错误的办法
解决Openwrt安装插件提示一下错误的办法 Openwrt安装17ce插件,提示一下错误: Collected errors: * check_data_file_clashes: Package ...
- IE 8兼容:<meta http-equiv="X-UA-Compatible" content="IE=edge" /> X-UA-Compatible的解释
前言:9月份开始了,大四也真正的到来了.深知自己网页布局还有很大的缺陷,接下来打算从工作中抽时间出来模仿着一些互联网公司的网站.顺便把基础理论知识打好. 第一个目标:小米官网:后续会把练习的项目放到g ...