BZOJ3238 [Ahoi2013]差异 SA+单调栈
题面
题解
考虑把要求的那个东西拆开算,前面一个东西像想怎么算怎么算,后面那个东西在建出\(height\)数组后相当于是求所有区间\(min\)的和*2,单调栈维护一波即可。
#include<bits/stdc++.h>
#define For(i,x,y) for (int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (int i=(x);i>=(y);i--)
#define cross(i,k) for (int i=first[k];i;i=last[i])
using namespace std;
typedef long long ll;
inline ll read(){
    ll x=0;int ch=getchar(),f=1;
    while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();
    if (ch=='-'){f=-1;ch=getchar();}
    while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}
const int N = 500010;
int n;
ll ans;
char c[N];
int cnt[N],x[N],y[N],SA[N],Rank[N],height[N];
inline void Radix_Sort(){
    int Max=0;
    For(i,1,n) cnt[x[i]]++,Max=max(Max,x[i]);
    For(i,1,Max) cnt[i]+=cnt[i-1];
    Dow(i,n,1) SA[cnt[x[y[i]]]--]=y[i];
    For(i,1,Max) cnt[i]=0;
}
inline void GetSA(){
    For(i,1,n) x[i]=c[i],y[i]=i;
    Radix_Sort();
    for (int i=1,p=1;p<n;i<<=1){
        p=0;
        For(j,n-i+1,n) y[++p]=j;
        For(j,1,n) if (SA[j]>i) y[++p]=SA[j]-i;
        Radix_Sort(),swap(x,y),x[SA[1]]=p=1;
        For(j,2,n) x[SA[j]]=(y[SA[j]]==y[SA[j-1]]&&y[SA[j]+i]==y[SA[j-1]+i])?p:++p;
    }
    For(i,1,n) Rank[SA[i]]=i;
    int k=0;
    For(i,1,n){
        if (Rank[i]==1) continue;k=max(0,k-1);
        for (int j=SA[Rank[i]-1];j+k<=n&&i+k<=n&&c[j+k]==c[i+k];k++);
        height[Rank[i]]=k;
    }
}
int top,q[N],l[N],r[N];
inline ll SumLcp(){
    For(i,1,n){
        while (top&&height[i]<height[q[top]]) r[q[top--]]=i-1;
        q[++top]=i,l[i]=q[top-1]+1;
    }
    while (top) r[q[top--]]=n;
    ll ans=0;
    For(i,1,n) ans+=1ll*(r[i]-i+1)*(i-l[i]+1)*height[i];
    return ans;
}
int main(){
    scanf("%s",c+1),n=strlen(c+1);
    GetSA();
    For(i,1,n) ans+=1ll*(n-i+1)*(n-i)+1ll*(n-i)*(n-i+1)/2;
    printf("%lld",ans-SumLcp()*2);
}
												
											BZOJ3238 [Ahoi2013]差异 SA+单调栈的更多相关文章
- BZOJ3238 [Ahoi2013]差异 【SAM or SA】
		
BZOJ3238 [Ahoi2013]差异 给定一个串,问其任意两个后缀的最长公共前缀长度的和 1.又是后缀,又是\(lcp\),很显然直接拿\(SA\)的\(height\)数组搞就好了,配合一下单 ...
 - Codeforces 802I Fake News (hard) (SA+单调栈) 或 SAM
		
原文链接http://www.cnblogs.com/zhouzhendong/p/9026184.html 题目传送门 - Codeforces 802I 题意 求一个串中,所有本质不同子串的出现次 ...
 - [bzoj3238][Ahoi2013]差异_后缀数组_单调栈
		
差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然 ...
 - BZOJ3238 [Ahoi2013]差异  【后缀数组 + 单调栈】
		
题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...
 - bzoj3238 [Ahoi2013]差异 后缀数组+单调栈
		
[bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
 - 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)
		
补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...
 - [BZOJ3238][AHOI2013]差异(后缀数组)
		
求和式的前两项可以直接算,问题是对于每对i,j计算LCP. 一个比较显然的性质是,LCP(i,j)是h[rk[i]+1~rk[j]]中的最小值. 从h的每个元素角度考虑,就是对每个h计算有多少对i,j ...
 - [BZOJ3238][Ahoi2013]差异解题报告|后缀数组
		
Description 先分析一下题目,我们显然可以直接算出sigma(len[Ti]+len[Tj])的值=(n-1)*n*(n+1)/2 接着就要去算这个字符串中所有后缀的两两最长公共前缀总和 首 ...
 - BZOJ3238: [Ahoi2013]差异 (后缀自动机)
		
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
 
随机推荐
- 关于HttpWebRequest发生服务器协议冲突的解决办法
			
WinForm下的app.config文件中添加: <system.net> <settings> <httpWebRequest useUnsafeHe ...
 - js刷题:leecode 25
			
原题:https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意就是给你一个有序链表.如1->2->3->4->5,还 ...
 - 【leetcode 简单】第十七题 x 的平方根
			
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...
 - PHP对象4: final 不允许重写方法或不允许继承类
			
final用在方法中,能继承方法, 不允许重写方法 final用在类声名中, 此类就不能继承 <?php class A{ final function say(){ say 'Ok<br ...
 - go标识符、变量、常量
			
标识符 标识符是用来表示Go中的变量名或者函数名,以字母或_开头.后可跟着字母.数字. _ 关键字 关键字是Go语言预先定义好的,有特殊含义的标识符. 变量 1. 语法:var identifier ...
 - makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解【转】
			
转自:http://www.cnblogs.com/lifexy/p/7065175.html 在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 ...
 - Oracle-AWR报告简介及如何生成【转】
			
AWR报告 awr报告是oracle 10g及以上版本提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解Oracle数据库的整个运行情况,比如硬 ...
 - Nginx部署部分https与部分http【转】
			
转自 Nginx部署部分https与部分http - na_tion的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/na_tion/article/details/ ...
 - linux       -j 4
			
把源码编译成可执行的二进制文件, 4为服务器内核数
 - 用js实现图片连播和联级菜单的实现
			
<!DOCTYPE html> <html> <head> <title>图片轮播</title> <style> div{ b ...