后缀数组+单调栈

  代码

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = ; const int MAXN = N; struct SuffixArray{
int wa[MAXN];
int wb[MAXN];
int wv[MAXN];
int ws[MAXN]; int sa[MAXN];
int rank[MAXN];
int height[MAXN];
int r[MAXN];
int n;
int m; void input(int *val, int len, int Max){
for (int i = ;i < len;i++)
r[i] = val[i];
r[len] = ;
n = len;
m = Max;
calSa();
calHeight();
} int cmp(int *r, int a, int b, int l){
return (r[a] == r[b] && r[a + l] == r[b + l]);
} void calSa(){
int i, j, p, *x = wa, *y = wb, *t;
for (i = ;i < m;i++) ws[i] = ;
for (i = ;i < n + ;i++) ws[x[i] = r[i]]++;
for (i = ;i < m;i++) ws[i] += ws[i - ];
for (i = n;i >= ;i--) sa[--ws[x[i]]] = i;
for (j = , p = ;p < n + ;j *= , m = p){
for (p = , i = n - j + ;i < n + ;i++) y[p++] = i;
for (i = ;i < n + ;i++) if (sa[i] >= j) y[p++] = sa[i] - j;
for (i = ;i < n + ;i++) wv[i] = x[y[i]];
for (i = ;i < m;i++) ws[i] = ;
for (i = ;i < n + ;i++) ws[wv[i]]++;
for (i = ;i < m;i++) ws[i] += ws[i - ];
for (i = n;i >= ;i--) sa[--ws[wv[i]]] = y[i];
for (t = x, x = y, y = t, p = , x[sa[]] = , i = ; i < n + ;i++)
x[sa[i]] = cmp(y, sa[i - ], sa[i], j) ? p - : p++;
}
} void calHeight(){
int i, j, k = ;
for (i = ;i <= n;i++) rank[sa[i]] = i;
for (i = ;i < n;height[rank[i++]] = k)
for (k?k--:, j = sa[rank[i]- ];r[i + k] == r[j + k];k++);
} int Log[MAXN];
int best[][MAXN];
void initRMQ() {
Log[] = -;
for(int i = ;i <= MAXN;i++){
Log[i]=(i & (i - ))?Log[i - ] : Log[i - ] + ;
}
for(int i = ; i <= n ; i ++) best[][i] = height[i];
for(int i = ; i <= Log[n] ; i ++) {
int limit = n - (<<i) + ;
for(int j = ; j <= limit ; j ++) {
best[i][j] = (best[i-][j] > best[i-][j+(<<i>>)]) ? best[i-][j+(<<i>>)] : best[i-][j];
}
}
}
int lcp(int a,int b) {
a = rank[a]; b = rank[b];
if(a > b){
int t = a;
a = b;
b = t;
}
a ++;
int t = Log[b - a + ];
return (best[t][a] > best[t][b - (<<t) + ])? best[t][b - (<<t) + ] : best[t][a];
}
}SA;
int a[N],i,len,top,stack[N];
long long ans,sum;
char s[N];
int main()
{
scanf("%s",&s);
len=strlen(s);
for (i=;i<=len;i++)
{
ans=ans+(long long)i*(len-);
a[i-]=s[i-];
}
SA.input(a,len,);
for (i=;i<=len;i++)
{
while (SA.height[i]<SA.height[stack[top]])
{
sum=sum-(long long)(stack[top]-stack[top-])*SA.height[stack[top]];
top--;
}
top++;stack[top]=i;
sum=sum+(long long)(stack[top]-stack[top-])*SA.height[stack[top]];
ans=ans-*sum;
}
printf("%lld\n",ans);
}
//3 1 4 2 5 0

[Ahoi2013]差异的更多相关文章

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

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

  2. bzoj 3238 Ahoi2013 差异

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

  3. BZOJ 3238: [Ahoi2013]差异 [后缀自动机]

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

  4. BZOJ_3238_[Ahoi2013]差异_后缀自动机

    BZOJ_3238_[Ahoi2013]差异_后缀自动机 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sam ...

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

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

  6. 【LG4248】[AHOI2013]差异

    [LG4248][AHOI2013]差异 题面 洛谷 题解 后缀数组版做法戳我 我们将原串\(reverse\),根据后缀自动机的性质,两个后缀的\(lcp\)一定是我们在反串后两个前缀的\(lca\ ...

  7. 【BZOJ3238】[AHOI2013]差异

    [BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...

  8. P4248 [AHOI2013]差异 解题报告

    P4248 [AHOI2013]差异 题目描述 给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \[\displaystyle \s ...

  9. 【BZOJ 3238】 3238: [Ahoi2013]差异(SAM)

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3047  Solved: 1375 Description In ...

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

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

随机推荐

  1. 关于Autoit上传文件的问题

    Autoit上传文件需要安装两个软件: 使用这个做文件上传时:在代码中需要添加的代码如下: Runtime.getRuntime().exec("d:/zhpg.exe"); D盘 ...

  2. JQuery+Ajax制作省市联动

    $(document).ready(function () { $("#Province").append("<option value=''>" ...

  3. JDBC连接池。。。转载

    1. 引言  近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机  应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架 ...

  4. android-View视图的根基类

  5. Java 多继承

    浅浅地上了几天 Java 的课程,然后怎么也想不明白:Java 不支持多继承有和接口到底是什么样的关系? 一只牛的故事. // 叫的抽象基类 abstract class call{ } // 跑的抽 ...

  6. IntelliJ 有的时候移动滚动条后会自动回到光标所在位置的解决方法

    关闭有道词典的取词.划词功能.

  7. window常用命令(持续更新)

    1.netstat -ano 查看端口占用情况  可以根据PID到任务管理器中找到对应的进程 2.tasklist|findstr 进程号(pid) 查看pid是哪个程序启用的 3.taskkill ...

  8. thinkphp自定义权限管理之名称判断

    权限管理,就是给不同的用户分配不同的权限.当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作.本次讲的是当用户登录一刻,只显示权限开启的内容. 一.建立数据库. 1.权限表funcla.来存 ...

  9. JavaAnnotation和反射简化开发

    Part I 我并不是在卖弄自己的英语有多少的了不起,只不过对Annotation这一次的解释真的很懊恼,“注解”和“注释”这两个对Annotation的翻译我听着不爽,所以全文都用Annotatio ...

  10. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...