bzoj 3238 Ahoi2013 差异
3238: [Ahoi2013]差异
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 2357 Solved: 1067
[Submit][Status][Discuss]
Description
.jpg)
Input
一行,一个字符串S
Output
一行,一个整数,表示所求值
Sample Input
Sample Output
HINT
2<=N<=500000,S由小写英文字母组成
Source
后缀数组+单调栈
今天终于学了后缀数组 记得去年的寒假 zjw学长给我们讲过这个东西 那时连倍增是什么都不知道。。。
我的后缀数组 是 nlog2n的 (因为我不会那个什么基数排序)
题目是道裸题 可以练练手
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define For(i,x,y) for(int i=x;i<=y;++i)
const int N = ;
using namespace std;
char s[N];
int sa[N],rk[N],h[N];
int Log[N];int n;
int st[N][];
struct data{
int i,x,y;
bool operator < (const data&a)const{
return (x<a.x||x==a.x&&y<a.y);
}
bool operator != (const data&a)const{
return (x!=a.x||y!=a.y);
}
}a[N];
void calh(){
int i,k=,j;
For(i,,n) rk[sa[i]]=i;
for(i=;i<=n;h[rk[i++]]=k)
{
if(k>)k--;int j=sa[rk[i]-];
while(s[i+k]==s[j+k])k++;
}
return;
}
//int lcp(int x,int y){
// if(x==y)return n-x+1;
// x=rk[x];y=rk[y];
// if(x>y){x^=y;y^=x;x^=y;}
// int len=y-x;x++;
// return min(st[x][Log[len]],st[1+y-1<<Log[len]][Log[len]]);
//}
long long q[N],qsum[N];
int main()
{
// freopen("sa.in","r",stdin);
// freopen("sa.out","w",stdout);
scanf("%s",s+);
n=strlen(s+);
For(i,,n)rk[i]=s[i];
For(i,,N-)Log[i]=Log[i>>]+;
memset(st,,sizeof(st));
for(int j=;j<=Log[n]+;++j){
For(i,,n) a[i]=(data){i,rk[i],rk[i+(<<j)]};
sort(a+,a+n+);int k=;
For(i,,n){
rk[a[i].i]=k;
if(a[i]!=a[i+])k++;
}
}
For(i,,n)sa[rk[i]]=i;
calh();
// For(i,1,n)printf("%d ",h[i]);
// For(i,1,n)st[i][0]=h[i];
// for(int j=1;j<=Log[n]+1;++j){
// For(i,1,n){
// if(i+(1<<j-1)>n)break;
// st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
// }
// }
long long ans=;
int r=;long long sum=;
For(i,,n){
long long tsum=;
while(r>&&q[r]>h[i])
sum=sum-q[r]*qsum[r],tsum+=qsum[r],r--;
q[++r]=h[i];qsum[r]=tsum;sum+=tsum*h[i];
ans-=*sum;
}
For(i,,n) ans+=1LL*i*(n-);
cout<<ans;
return ;
}
bzoj 3238 Ahoi2013 差异的更多相关文章
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2512 Solved: 1140[Submit][Status ...
- bzoj 3238: [Ahoi2013]差异 -- 后缀数组
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 一行,一个字符串S Output 一行,一个 ...
- ●BZOJ 3238 [Ahoi2013]差异
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...
- 洛谷 P4248: bzoj 3238: [AHOI2013]差异
题目传送门:洛谷 P4248. 题意简述: 定义两个字符串 \(S\) 和 \(T\) 的差异 \(\operatorname{diff}(S,T)\) 为这两个串的长度之和减去两倍的这两个串的最长公 ...
- BZOJ 3238 [Ahoi2013]差异(后缀自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...
- BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp
http://www.lydsy.com/JudgeOnline/problem.php?id=3238 就算是全局变量,也不要忘记,初始化(吐血). 长得一副lca样,没想到是个树形dp(小丫头还有 ...
- BZOJ 3238: [Ahoi2013]差异((单调栈+后缀数组)/(后缀树))
[传送门[(https://www.lydsy.com/JudgeOnline/problem.php?id=3238) 解题思路 首先原式可以把\(len\)那部分直接算出来,然后通过后缀数组求\( ...
- BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)
题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...
随机推荐
- 基于toyix的进程和轻权进程的学习
我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作.大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程 ...
- android资料
http://bbs.51cto.com/thread-903936-1.html http://zhidao.baidu.com/question/195697097.html?sort=4& ...
- RFID电子标签加工的倒装工艺
倒装对于半导体封装领域的人员而言,是再熟悉不过的了.一般我们看到的集成电路多数以塑封为主,半导体芯片和外界进行信息沟通的通道,靠的就是集成电路的管脚.如果把集成电路外面的封装去掉,会发现每个集成电路内 ...
- 外部函数接口 LibFFI
“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码.而 “Libffi” 库只提供了最底层的.与架构相关的.完整的”FF ...
- android获取屏幕宽高与获取控件宽高
获取屏幕宽高 // 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素 ...
- 第24讲 UI_布局 之帧布局 表格布局 绝对布局
第24讲 UI_布局 之帧布局 表格布局 绝对布局 3. FrameLayout(帧布局) 帧布局是从屏幕的左上角(0,0)坐标开始布局,多个组件层叠排序,后一个组件总会将前一个组件所覆盖,除非最后一 ...
- hdu1015(Safecracker )
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
- web请求的处理流程
web请求的处理流程如下: 1.客户发起请求到服务器网卡:2.服务器网卡接受到请求后转交给内核处理:3.内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程4.Web服务器进程根据用户 ...
- wp8模拟器操作键盘
当前焦点在模拟器上的某一个输入控件上时候, 按pagedown/pageup可以切换是用pc键盘还是模拟器键盘
- C#编写Windows服务程序图文教程(转载)
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...