【[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结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...
随机推荐
- linux 修改用户主目录(转载)
第一:修改/etc/passwd文件 第二:usermod命令 详细说明如下: 第一种方法: vi /etc/passwd 找到要修改的用户那几行,修改掉即可.此法很暴力,建议慎用. 第二种:user ...
- [转]浅谈 .NET Framework 与 .NET Core 的区别与联系
本文转自:http://www.cnblogs.com/huchaoheng/p/6295688.html 2017到了,咱们学点啥啊,要想知道学点啥,先弄清.NET Framework 与 .NET ...
- Expression Blend实例中文教程(7) - 动画基础快速入门Animation
通过前面文章学习,已经对Blend的开发界面,以及控件有了初步的认识.本文将讲述Blend的一个核心功能,动画设计.大家也许注意到,从开篇到现在,所有的文章都是属于快速入门,是因为这些文章,都是我曾经 ...
- nodejs封装mssql
对mssql操作Sqlserver数据库的基本封装: 记录一下: /** * Created by chaozhou on 2015/9/18. */ var mssql = require('mss ...
- react-native学习之入门app
1.项目初始化: react-native init MyProject 2.启动项目: cd MyProject react-native start 新开cmd窗口: react-native r ...
- node版本的切换(转)
大量开发者的贡献使Node版本的迭代速度很快,版本很多(横跨0.6到0.11),所以升级Node版本就成为了一个问题.目前有n和nvm这两个工具可以对Node进行无痛升级,本文简单介绍一下二者的使用. ...
- SpringMVC 工作流程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/baidu_36697353/article/details/64444147 SpringMVC 工 ...
- 读EntityFramework.DynamicFilters源码_心得_整体了解01
前两天同事发给我一个连接地址:实体框架高级应用之动态过滤 EntityFramework DynamicFilters为什么会找到动态过滤的内容,是源于前段时间,我们想做一个个人blog 后端用.NE ...
- Bzoj3105:[CQOI2013]新Nim游戏
题面 传送门 Sol 也是拿出一些数,使剩下的异或起来不为\(0\) 而线性基内的数异或不出\(0\) 那么从大到小加到线性基内 然后中途为\(0\)了,就取走它 这样我们使最大的在线性基内,剩下的是 ...
- java idea+ssm框架遇到的问题
0.学习教程 http://www.cnblogs.com/jiekzou/p/9205117.html https://github.com/crossoverJie/SSM 1.gradle没刷新 ...