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时(数轴) ...
随机推荐
- Java模拟公司置办货物系统(二)
採用MVC风格,将数据写入文件,模拟公司置办货物系统. A类表示普通员工,B类表示部门精力,C类表示採购部,D类表示资源管理部. 订单状态 1.表示申请状态 2.表示通过审批 3.表示未通过审批 4 ...
- python内置函数之vars()
vars([object]) 返回__dict__属性的值.当不传入参数时,和locals()等效.当函数接收一个参数时,参数可以是模块.类.类实例,或者定义了__dict__属性的对象. >& ...
- 如何使用微信JS-SDK实际分享功能
http://jingyan.baidu.com/album/d3b74d64c517051f77e609ed.html?picindex=7
- jQuery 效果 - slideToggle() 方法
实例 通过使用滑动效果,在显示和隐藏状态之间切换 <p> 元素: $(".btn1").click(function(){ $("p").slide ...
- Activiti - 新一代的开源 BPM 引擎 (zhuan)
http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...
- jquery 情况form表单的所有内容
#project_file_upload 为表单的id $(':input','#project_file_upload') .not(':button, :submit, :reset, :hidd ...
- 这不是bug,而是语言特性
分析编程语言缺陷的一种方法是把所有的缺陷归于3类:不该做的做了,该做的没做,该做但做得不合适. 在使用switch case时,如果使用缺省的 fall through,请一定在旁边注释,因为97%的 ...
- 单调栈poj2796
题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以4为最小值,向左右延伸,6 4 5 值为60....... ...
- vuex 定义
vuex是什么? vuex是一个专为vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex也集成到vue的官方调试 ...
- 解决Error:Android Dex: com.android.dex.DexIndexOverflowException: Cannot merge new index 65918 into a
错误:Error:Android Dex: com.android.dex.DexIndexOverflowException: Cannot merge new index 65918 into a ...