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时(数轴) ...
随机推荐
- 【android开发】使用PopupWindow实现页面点击顶部弹出下拉菜单
没有太多花样,也没有很复杂的技术,就是简单的PopupWindow的使用,可以实现点击弹出一个自定义的view,view里可以随便设计,常用的可以放一个listview. demo中我只是一个点击展示 ...
- hive partition 分区使用
一.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表 ...
- ICSharpCode.SharpZipLib工具压缩与解压缩zip文件
using System; using System.Collections.Generic; using System.IO; using System.Text; using ICSharpCod ...
- hibernate中一些属性对操作的影响
1 inverse,在一对多中使用,表示是否有关联关系控制权.对于保存.删除数据有影响. 2 cascade,表示级联操作 save-update 表示级联保存和更新 delete 表示级联删除 al ...
- 交叉编译Node.js到OpenWrt(HG255D)
操作系统:deepin linux 2013 或 ubuntu 13.04 1.安装交叉编译前.须要安装的包 sudo apt-get install build-essential subversi ...
- 连接SQLServer的增删改查方法代码
在Visual C++中用ADO进行数据库编程 1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序CADOConnection,然后在使用A ...
- Windows 7 Path环境变量255限制的解决办法,SUBST
C:\Users\xxx>subst /? Associates a path with a drive letter. SUBST [drive1: [drive2:]path] SUBST ...
- CLoadScene类
#ifndef __LOADSCENE_H__ #define __LOADSCENE_H__ #include "GameFrameHead.h" class CGameScen ...
- bazel-编译一个源文件生成可执行程序
demo1 使用bazel编译一个源文件生成可执行程序简单示例 demo1目录树 demo1 ├── app │ ├── BUILD │ └── hello_world.cpp ├── README. ...
- JAVA第一个窗体小程序
import java.awt.*;public class Day1015_Frame{ public static void main(String[] args) { ...