[AHOI2013] 差异

Description

求 \(\sum {len(T_i) + len(T_j) - 2 lcp(T_i,T_j)}\) 的值

其中 \(T_i (i = 1,2,...,n)\) 为后缀串 \(S[i,n]\)

Solution

单调栈乱扫一发即可。

始终维护当前栈内元素的和,然后加进答案里。

#include <bits/stdc++.h>
using namespace std; #define int long long int n,m=256,sa[1000005],y[1000005],u[1000005],v[1000005],o[1000005],r[1000005],h[1000005],T;
char str[1000005];
int ans = 0, sum = 0;
int sta[1000005],stap[1000005],top=0; signed main(){
cin>>str+1;
n=strlen(str+1); for(int i=1;i<=n;i++) u[str[i]]++;
for(int i=1;i<=m;i++) u[i]+=u[i-1];
for(int i=n;i>=1;i--) sa[u[str[i]]--]=i;
r[sa[1]]=1;
for(int i=2;i<=n;i++) r[sa[i]]=r[sa[i-1]]+(str[sa[i]]!=str[sa[i-1]]); for(int l=1;r[sa[n]]<n;l<<=1) {
memset(u,0,sizeof u);
memset(v,0,sizeof v);
memcpy(o,r,sizeof r);
for(int i=1;i<=n;i++) u[r[i]]++, v[r[i+l]]++;
for(int i=1;i<=n;i++) u[i]+=u[i-1], v[i]+=v[i-1];
for(int i=n;i>=1;i--) y[v[r[i+l]]--]=i;
for(int i=n;i>=1;i--) sa[u[r[y[i]]]--]=y[i];
r[sa[1]]=1;
for(int i=2;i<=n;i++) r[sa[i]]=r[sa[i-1]]+((o[sa[i]]!=o[sa[i-1]])||(o[sa[i]+l]!=o[sa[i-1]+l]));
}
{
int i,j,k=0;
for(int i=1;i<=n;h[r[i++]]=k)
for(k?k--:0,j=sa[r[i]-1];str[i+k]==str[j+k];k++);
}
for(int i=1;i<=n;i++)
{
ans += i*(n-1ll);
}
for(int i=1;i<=n;i++)
{
while(top && sta[top]>=h[i])
{
sum -= sta[top] * (stap[top]-stap[top-1]);
--top;
}
++top;
sta[top]=h[i];
stap[top]=i;
sum += sta[top] * (stap[top]-stap[top-1]);
//cout<<"i="<<i<<" sum="<<sum<<endl;
ans -= 2ll*sum;
} cout<<ans<<endl;
}

[AHOI2013] 差异 - 后缀数组,单调栈的更多相关文章

  1. 【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈

    [BZOJ3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...

  2. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  3. bzoj3238 [Ahoi2013]差异 后缀数组+单调栈

    [bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...

  4. 【BZOJ-3238】差异 后缀数组 + 单调栈

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1561  Solved: 734[Submit][Status] ...

  5. 【bzoj3238】差异[AHOI2013](后缀数组+单调栈)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 这道题从大概半年以前就开始啃了,不过当时因为一些细节没调出来,看了Sakits神犇 ...

  6. BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈

    BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...

  7. BZOJ3238 [Ahoi2013]差异 【后缀数组 + 单调栈】

    题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...

  8. bzoj 3238: [Ahoi2013]差异 -- 后缀数组

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 一行,一个字符串S Output 一行,一个 ...

  9. 【BZOJ3879】SvT 后缀数组+单调栈

    [BZOJ3879]SvT Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干 ...

随机推荐

  1. 等差数列,for循环,递归和尾递归的对比

    生活中,如果1+2+3+4.....+100,大家基本上都会用等差数列计算,如果有人从1开始加,不是傻就是白X,那么程序中呢,是不是也是这样.今天无意中看到了尾递归,以前也写过,但是不知道这个专业名词 ...

  2. 如何将下载的Jar包导入本地Maven仓库-sunziren

    原创文章,转载请注明出处博客园! 昨天在打开一个Spring Boot项目的时候,发现pom.xml的文件图标上有个小红点,遂打开查看到底报的什么错. 原来是ojdbc14-10.2.0.4.0.ja ...

  3. 数据库->神奇的concat_ws函数

    神奇的concat_ws函数 了解到concat_ws函数起因是因为:朋友给我发了一份面试题,其中有一句看似很简单的查询,但是我就是没做出来.如下图:   经查阅资料了解通过两个字段拼接并且用“_”进 ...

  4. Win10查看屏保的所在位置

    路径 C:\Users\Hlzy\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\Local ...

  5. BundlePhobia

    1.BundlePhobia用于分析npm package的依赖.bundle后的大小.下载速度预估等等,帮助你在引用一个package之前了解引入该package的代价. 2.也可以将项目的pack ...

  6. 【内推】2020微软苏州Office365众多核心团队热招150+研发精英!欢迎推荐

    2020微软苏州Office365众多核心团队热招150+研发精英!欢迎推荐 大家好,目前微软Office365核心团队在美丽宜居的苏州有150多的社招职位虚位以待,欢迎大家自荐,推荐,转发!除以下列 ...

  7. LOJ #6402. yww 与校门外的树 多项式求逆

    蛮神的一道题. code: #include <cmath> #include <cstring> #include <algorithm> #include &l ...

  8. 剑指offer-面试题14-剪绳子-动态规划法

    /* 题目: 给定一个长度为n的绳子,把绳子剪为m段,(n>1,m>1) 求各段绳子乘积的最大值. */ /* 思路: 动态规划. f(n)=max(f(1)*f(n-1),f(2)*f( ...

  9. linq to sql 获取sql与参数添加到日志中

    这里的linq to sql并未使用ef 主要有以下内容 1.新增 2.修改 3.删除 4.查询 1.新增,修改,删除获取sql语句通过DataContext.Log获取执行的sql语句 String ...

  10. 牛客寒假训练营2-C算概率

    思路 用 f(i,j) 来表示当前做了i道题,共做对了j道题 状态 f[i][j] = f[i-1][j] * (1-p[i]) + f[i-1][j-1] * p[i] 第一种:由于i-1时对了j题 ...