JZOJ.5315【NOIP2017模拟8.19】小串串
Description
Input
Output
Sample Input
4
aa
abcd
ccc
abcc
Sample Output
5
10
14
12
Data Constraint
字符串操作我们可以采用任何后缀的东西,包括后缀数组,后缀自动机,后缀树等等...
鉴于某蒟蒻只会后缀数组下面我们采用后缀数组的方法
本题要求出某字符子串在原串出现的次数,我们对原串求出height数组后,将height[i]值作为纵坐标,横坐标为i我们可以发现
矩形宽度即为某子串出现的次数,高度为该串的长度,每个单位高度的矩形就对答案贡献宽度的平方值,于是我们用单调栈来统计这矩形对答案的贡献,然后剩下的子串对答案都贡献1即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#define N 100005
using namespace std;
long long t,n,sa[N],rank[N],tp[N],tax[N],h[N],len,a[N],top,id[N],sum,m,ans,oo[N];
char qwq[N];
void rsort(){
for (int i=;i<=m;i++) tax[i]=;
for (int i=;i<=len;i++) tax[rank[tp[i]]]++;
for (int i=;i<=m;i++) tax[i]+=tax[i-];
for (int i=len;i>=;i--) sa[tax[rank[tp[i]]]--]=tp[i];
}
bool comp(long long *f,int x,int y,int w){
return ((f[x]==f[y])&&(f[x+w]==f[y+w]));
}
void SS(){
for (int i=;i<=len;i++) rank[i]=a[i],tp[i]=i;
m=;rsort();
for (int i,p=,w=;p<len;w+=w,m=p){
for (p=,i=len-w+;i<=len;i++) tp[++p]=i;
for (i=;i<=len;i++) if (sa[i]>w) tp[++p]=sa[i]-w;
rsort();swap(tp,rank);rank[sa[]]=;p=;
for (i=;i<=len;i++) rank[sa[i]]=comp(tp,sa[i],sa[i-],w)?p:++p;
}
int j=,k=;
for (int i=;i<=len;oo[rank[i++]]=k)
for (k=k?k-:k,j=sa[rank[i]-];a[i+k]==a[j+k];k++);
}
void work(){
long long tmp=;
for (long long i=;i<=len;i++){
while ((h[id[top]]>=h[i])&&(top>)){
long long x=i-id[top-];
long long y=h[id[top]]-max(h[id[top-]],h[i]);
ans+=x*x*y;
sum+=x*y;
top--;
}
id[++top]=i;
}
ans+=(n-sum);
printf("%lld\n",ans);
}
void clear(){
memset(sa,,sizeof(sa));
memset(rank,,sizeof(rank));
memset(h,,sizeof(h));
memset(id,,sizeof(id));
memset(a,,sizeof(a));
top=;
ans=;
sum=;
len=;
n=;
}
int main(){
for (scanf("%lld",&t);t;t--){
scanf("%s",qwq);
n=strlen(qwq);
for (int i=;i<n;i++)
a[i+]=(long long)qwq[i]-(long long)'a'+;
len=n;
n=n*(n+)/;
SS();
for (int i=;i<=len;i++)
h[i]=oo[i+];
work();
clear();
}
return ;
}
神奇的代码
第一次打单调栈打到崩溃QAQ
JZOJ.5315【NOIP2017模拟8.19】小串串的更多相关文章
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
- 模拟XShell的小项目
不知道大家有没有用过XShell这款工具,这款工具通过windows可以远程操作处于开机状态的linux操作系统,也就是说把你的电脑和一台服务器连入网络,你通过输入服务器所在的IP地址建立一个会话就可 ...
- 常用Java API之Ramdom--用代码模拟猜数小游戏
常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
随机推荐
- Linux 设置IP,gate, 以及自动获取IP的方法
一.使用命令设置ubuntu的ip地址 1.修改配置文件blacklist.conf禁用IPV6: sudo vi /etc/modprobe.d/blacklist.conf 2.在文档最后添加 b ...
- EntityFramework Data Annotations
详细的实体映射介绍(Data Annotation) http://msdn.microsoft.com/en-us/data/jj591583
- localStorage使用总结,页面跳转,保存值
例子 <ul id="edit" contenteditable="true"> <li>修改我吧,然后刷新页面看看,^_^</l ...
- [elk]Mutate filter plugin增删改查字段
Mutate filter plugin参考: https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html ...
- 使用c++的cocos2d-x-3.0rc1程序公布apk
(如今cocos2dx-x-3.0正式版已经出了.之前用的cocos2d-x-3.0rc1,就先用这个版本号吧) 0. 完毕C++项目 在cmd下使用cocos.py new命令,然后习惯性的在win ...
- 页面跳转时候拼接在url后面的多个 参数获取
function GetRequest() { var url = location.search; var theRequest = new Object(); if (url.indexOf(&q ...
- pyspark采用python3开发
现在时间2017-04-17. python版本3.5支持pyspark python3.6目前还不支持 做法简单,只需要在bin/pyspark中增加 export PYSPARK_PYTHON=p ...
- Log4j容器深入探究
1.思考 容器是什么? 水壶是容器,水壶中存放着水,等我们需要水了,直接用 Spring中的ApplicationContext是容器,里面存放着各种Bean,等我们需要了直接用,并且可以创建管理Be ...
- 彻底征服 Spring AOP 之 理论篇
基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...
- PowerPoint 2010 设置演讲者模式