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时(数轴) ...
随机推荐
- 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
一.迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章. 二.插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterato ...
- cookie,session,localStage,sessionStage区别
Cookie和Session详解 1.什么是Cookie Cookie是存放在客户端浏览器的Name/Value键值对,访问服务器时,会自动传递给服务器. Cookie的生成方式有两种,服务器写入,客 ...
- win7如何连接蓝牙键盘
控制面板->硬件和声音->查看设备和打印机->添加设备
- 一款基于jQuery的带文字标题上下切换焦点图
今天给大家分享一款很实用的jQuery焦点图插件,它的最大特点就是使用非常方便,而且实现相对比较简单.焦点图的图片下方悬浮文字链接,鼠标滑过文字时即可切换至相应的图片,在图片切换的过程中出现淡入淡出的 ...
- 跟着百度学PHP[13]-文件上传
PS:上传的时候一定要用POST方法,GET方法不行. 文件上传的entype要改成“mutilpart/form-data”这个编码 <html> <form action=&qu ...
- java Web监听器导图详解
监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特 ...
- [shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别
一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 转自:http://ww ...
- am335x -- led 控制
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...
- SpringBoot资源国际化
Springboot根据浏览器实现网站资源国际化 根据浏览器地区主动选择资源 1.创建资源化文件 resource目录下创建messages目录 创建messages_en_US.properties ...
- JavaScript重载
在Javascript 中,每个函数都有一个隐含的对象arguments,表示给函数 实际传给的参数 ,那么我们可以用 arguments来实现函数的重载 <!DOCTYPE html PUBL ...