123D
后缀数组+单调栈
看了好长时间,最后看了张神的程序才搞懂
意思就是求所有子串*n*(n+1)/2 n是子串出现次数
事实上,lcp可以看成宽度为1,高度为lcp值的长方形,所有lcp放在一起就是一堆长方形放在一起,然后我们就要求对于每个高度对应的长方形的面积乘上一个值
每个长方形可以用单调栈求,也就是一个高度能最远延伸到哪里,单调栈维护当前长方形的高度递增。

比如说这个样子,
不满足单调性了,

这段红色的区间就要截掉

进来一个比较高的不用管

进来一个比较小的删掉红的

变成了这个样子

进来一个很小的

先把红色删掉

再把这块删掉,于是栈里又是不递增的了
最后我们把一个高度为0的lcp放入栈中,就把所有长方形加到答案里了。
还有一种情况,自己和自己也要加入答案,那么我们先把这个算掉再放入栈中。
做后缀数组要把所有和lcp无关的东西都砍掉,像自己和自己的答案应该单独统计,lcp有关的一起算,这样会方便很多
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 500010
ll ans;
int n,k, top;
char s[N];
int Rank[N],sa[N],temp[N],lcp[N],st[N][],l[N],r[N];
inline bool cp(int i,int j)
{
if(Rank[i]!=Rank[j]) return Rank[i]<Rank[j];
int ri=i+k<=n?Rank[i+k]:-;
int rj=j+k<=n?Rank[j+k]:-;
return ri<rj;
}
void Sa()
{
for(int i=;i<=n;++i)
{
Rank[i]=s[i]; sa[i]=i;
}
for(k=;k<=n;k<<=)
{
sort(sa+,sa+n+,cp);
temp[sa[]]=;
for(int i=;i<=n;++i) temp[sa[i]]=temp[sa[i-]]+(cp(sa[i-],sa[i]));
for(int i=;i<=n;++i) Rank[i]=temp[i];
}
}
void Lcp()
{
for(int i=;i<=n;++i) Rank[sa[i]]=i;
int h=;
for(int i=;i<=n;++i)
{
if(Rank[i]<=) continue;
int j=sa[Rank[i]-];
if(h>) --h;
for(;i+h<=n&&j+h<=n;++h) if(s[i+h]!=s[j+h]) break;
lcp[Rank[i]]=h;
}
}
ll mul(ll x)
{
return x * (x + 1ll) / 2ll;
}
int main()
{
scanf("%s",s+);
n = strlen(s + );
Sa();
Lcp();
for(int i = ; i <= n; ++i)
{
ans += (ll)(n - sa[i] + ) - max(lcp[i], lcp[i + ]);
int left = i;
while(top && lcp[i + ] < st[top][])
{
ans += mul(i - st[top][] + ) * (st[top][] - max(st[top - ][], lcp[i + ]));
left = st[top][];
--top;
}
++top;
st[top][] = left;
st[top][] = lcp[i + ];
}
printf("%lld\n", ans);
return ;
}
123D的更多相关文章
- Codeforces #123D: 后缀数组+单调栈
D. String You are given a string s. Each pair of numbers l and r that fulfill the condition 1 ≤ ...
- centos6环境下搭建irc服务器
问题描述 有时候逛技术社区,经常会发现有个叫IRC的东西存在,想搭建下看看到底是个什么东西 说明: 操作系统环境为CentOS6.5_64 安装irc服务器 通过yum进行安装,命令如下: yum i ...
- 迈出物联网的第一步,玩儿一下Arduino
大家知道,现在物联网Internet of Things(IoT) 方兴未艾,各种智能设备层出不穷,手表.手环.甚至运动鞋等可穿戴设备,还有智能家居产品,无时无刻不冲击着我们的思想和眼球.Autode ...
- Node.js入门笔记(4):文件系统(fs)
文件系统(FileSystem) 文件系统模块 对于文件无外乎创建修改添加. File System - 文件系统模块 - require('fs') fs模块是核心模块,需要使用require导入后 ...
- Autodesk的照片建模云服务—Autodesk ReCap 360 photo
现实捕捉技术方兴未艾,简单的讲现实捕捉技术就是把现实中的现状信息数字化到计算机中以便做进一步的处理.对于不同的应用目的会有不同的捕捉设备,工程或传媒娱乐行业中经常用到的肯定就是三维模型了.那如何得到三 ...
- The Basics of 3D Printing in 2015 - from someone with 16 WHOLE HOURS' experience
全文转载自 Scott Hanselman的博文. I bought a 3D printer on Friday, specifically a Printrbot Simple Metal fro ...
- 3D建模与处理软件简介
[前言]自半年前笔者发表博客“什么是计算机图形学”以来,时常有人来向笔者询问3D模型的构建方法与工具.笔者的研究方向是以3D技术为主,具体包括3D建模,3D处理及3D打印三个方面,在3D建模与处理方面 ...
- 【Gerrit】Gerrit与Jenkins/Hudson CI服务器搭建
配置Git 很多系统(例如Linux)已经默认提供了Git,在Git主页也可以找到安装程序.对于Windows用户,最好的选择是MsysGit.请注意,如果你安装了Apple Developer To ...
- OSGEARTH三维地形开源项目
第一章 OSGEarth介绍 第二章 OSGEarth编译环境配置 OSGEarth的编译环境配置随着版本的不同.运行平台的不同,也有很大的差异.本章主要以Windows XP SP3(x86 ...
随机推荐
- JS——this与new
this: 1.this只出现在函数中 2.谁调用函数,this就指的是谁 3.new People的this指的就是被创建的对象实例 new: 1.开辟内存空间,存储新创建的对象 2.把this设置 ...
- 2016.01.22 前端学习 HTML/CSS
学习HTML/CSS http://edu.51cto.com/course/course_id-3116.html 明日实践
- codeforces_731D_(前缀和)(树状数组)
D. 80-th Level Archeology time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- Objective-C在ARC下结合GCD的单例模式和宏模版
单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法: static MyGizmoClass *sharedGizmoManager = nil; + (MyGi ...
- zepto处理touch事件
处理Touch事件能让你了解到用户的每一根手指的位置,在touch事件触发的时候产生,可以通过touch event handler的event对象取到,如果基于zepto.js开发,一般是通过eve ...
- (2)搜索广告CTR预估
https://www.cnblogs.com/futurehau/p/6184585.html 1. CTR预估的流程 数据 -> 预处理 ->特征抽取 ->模型训练 ->后 ...
- easyui 网址
http://www.runoob.com/jeasyui/jeasyui-datagrid-datagrid23.html http://www.jeasyui.com http://fineui. ...
- python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- elisp 编程 if 特殊表
elisp中的 if 特殊表与其他语言中的 if 语句逻辑上并无二致,关键在于如何使用. (if (> 4 3) (message "4 is greater than 3" ...
- ansible ad-hoc 参考
# 检查主机连接 # ansible test -m ping # 执行远程命令 # ansible test -m command -a 'uptime' # 执行主控端脚本 # ansible t ...