3238: [Ahoi2013]差异

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2357  Solved: 1067
[Submit][Status][Discuss]

Description

Input

一行,一个字符串S

Output

一行,一个整数,表示所求值

Sample Input

cacao

Sample Output

54

HINT

2<=N<=500000,S由小写英文字母组成

Source

[Submit][Status][Discuss]


后缀数组+单调栈

今天终于学了后缀数组 记得去年的寒假 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 差异的更多相关文章

  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: 2512  Solved: 1140[Submit][Status ...

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

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

  4. ●BZOJ 3238 [Ahoi2013]差异

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...

  5. 洛谷 P4248: bzoj 3238: [AHOI2013]差异

    题目传送门:洛谷 P4248. 题意简述: 定义两个字符串 \(S\) 和 \(T\) 的差异 \(\operatorname{diff}(S,T)\) 为这两个串的长度之和减去两倍的这两个串的最长公 ...

  6. BZOJ 3238 [Ahoi2013]差异(后缀自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...

  7. BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 就算是全局变量,也不要忘记,初始化(吐血). 长得一副lca样,没想到是个树形dp(小丫头还有 ...

  8. BZOJ 3238: [Ahoi2013]差异((单调栈+后缀数组)/(后缀树))

    [传送门[(https://www.lydsy.com/JudgeOnline/problem.php?id=3238) 解题思路 首先原式可以把\(len\)那部分直接算出来,然后通过后缀数组求\( ...

  9. BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)

    题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...

随机推荐

  1. LeetCode_Edit Distance

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  2. spring注解方式 idea报could not autowire,eclipse却没有问题

    解决办法1: 从根本上解决: File-Project Structure 页面 Facets下删掉 Spring(直接右键Delete) 这个解答是对的.并不会降低安全性!!因为创建项目的时候,都是 ...

  3. vim 中Ctags的安装和使用

    Ctags是一个用来为源文件中的标识符(如变量.函数.类成员.宏定义等)创建索引文件的程序.这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名 ...

  4. 微软CEO史蒂夫·鲍尔默(Steve Ballmer)在12个月内退休

    Microsoft CEO Steve Ballmer to retire within 12 months Aug. 23, 2013 Board of directors initiates su ...

  5. 前端HTML与CSS编码规范

    HTML 语法 HTML5 doctype 语言属性(Language attribute) 字符编码 IE 兼容模式 引入 CSS 和 JavaScript 文件 实用为王 属性顺序 布尔(bool ...

  6. 前端开发利器—FIDDLER 转

    http://www.cnblogs.com/yuzhongwusan/archive/2012/07/20/2601306.html 前端开发利器—FIDDLER 1.Fiddler相对其他调试工具 ...

  7. Direct3D 11的流水线

    流水线 流水线(Pipeline)是理解D3D必须要掌握的概念. 整个流水线有很多步骤,有的步骤是固定功能,不用怎么配置,有的步骤是要写代码的,也就是所谓的着色器程序(Shader). 一般来说,将流 ...

  8. 在sae配置django项目

    1:使用sae开发必须有sae帐号,自己注册吧: 2:在sae上新建立一个python项目: 3:建立完成之后新建一个版本,即版本1: 4:获取svn的地址在eclipse中check下来: 5:注意 ...

  9. [AngularJS + RxJS] Search with RxJS

    When doing search function, you always need to consider about the concurrent requests. AEvent ----(6 ...

  10. 使用C++11实现无锁stack(lock-free stack)

    前几篇文章,我们讨论了如何使用mutex保护数据及使用使用condition variable在多线程中进行同步.然而,使用mutex将会导致一下问题: 等待互斥锁会消耗宝贵的时间 — 有时候是很多时 ...