AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3238

【题解】

题上所给公式可以化为

其中:

=1×(n-1)+2×(n-2)+3×(n-3)+……+(n-1)×1+2×1+3×2+……+n×(n-1)

=(n+1)+2×(n+1)+3×(n+1)+……+(n-1)(n+1)

=(1+2+3+……+(n-1))(n+1)

=n(n-1)(n+1)/2

接着考虑后面的,我们把串逆序后建成SAM,搞出后缀树,我们知道在后缀树上两个点的LCA的深度就是它们的公共字串长度

所以我们考虑树形dp,对于每一条边,它的贡献就是v[i]*C[size[x]][2]

后来膜拜了一下LZX的代码,发现我们其实不用建出后缀树,只需要搞出它的拓扑序,用子节点更新父节点的答案就行了。

比建后缀树的代码快了1s,在bzoj上排名第10,(那些用指针写的真心快啊)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
#define FILE "read"
#define MAXN 1000010
#define up(i,j,n) for(int i=j;i<=n;++i)
#define dn(i,j,n) for(int i=j;i>=n;--i)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
//struct node{int y,next,v;}e[MAXN*2];
int n,now(1),cnt(1),len,Link[MAXN],size[MAXN],par[MAXN],c[MAXN],id[MAXN],mx[MAXN],son[MAXN][27];
ll ans;
char ch[MAXN];
/*void insert(int x,int y,int v){e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;e[++len].next=Link[y];Link[y]=len;e[len].y=x;e[len].v=v;
}*/
void extend(int x){int p=now,np=++cnt;mx[np]=mx[now]+1; now=np;  size[np]=1;while(!son[p][x]&&p)  son[p][x]=np,p=par[p];if(!p)  par[np]=1;else{int q=son[p][x];if(mx[q]==mx[p]+1)  par[np]=q;else{int nq=++cnt; mx[nq]=mx[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));par[nq]=par[q]; par[q]=par[np]=nq;while(son[p][x]==q)  son[p][x]=nq,p=par[p];}}
}
void topsort(){up(i,1,cnt)  c[mx[i]]++;up(i,1,n)    c[i]+=c[i-1];up(i,1,cnt)  id[c[mx[i]]--]=i;
}
/*void dp(int x,int fa,int v){for(int i=Link[x];i;i=e[i].next){if(e[i].y==fa)  continue;dp(e[i].y,x,e[i].v);size[x]+=size[e[i].y];}ans-=(ll)size[x]*(size[x]-1)*v;
}*/
int main(){freopen(FILE".in","r",stdin);freopen(FILE".out","w",stdout);scanf("%s",ch+1); n=strlen(ch+1);dn(i,n,1)  extend(ch[i]-'a');//up(i,2,cnt)  insert(i,par[i],mx[i]-mx[par[i]]);ans=(ll)n*(n-1)*(n+1)/2;  //dp(1,0,0);topsort();  dn(i,cnt,2) {int x=id[i];size[par[x]]+=size[x];ans-=(ll)(mx[x]-mx[par[x]])*(size[x]-1)*size[x];}printf("%lld\n",ans);return 0;
}

【bzoj3238】差异 后缀自动机相关推荐

  1. bzoj3238 [Ahoi2013]差异 后缀自动机

    这个题虽然看起来比较麻烦,但其实有一点搞懂了就好做了 每一个后缀的前缀的lcp一定是这个串里的子串, 对于全部子串,如果它不是后缀,那一定可以找到这个串对应的后缀, 而这样的子串和后缀子串是没有区别的 ...

  2. bzoj3238 [Ahoi2013]差异 后缀自动机

    题意:给出一个串,求其中任意两个字串的lcp的总和. 我们可以对于这个串建一颗后缀自动机,实际上,他的parent边树就是一颗后缀树,我们在后缀树上统计答案,设f表示right集合的大小,可以理解为后 ...

  3. bzoj3238 [ AHOI2013 ] --后缀自动机

    显然只需求LCP(i,j)就可以了. 将s反转,然后插入后缀自动机.由于后缀自动机的link指针构成了一棵后缀树,而字符串又反转过,所以两个结点的LCP就是LCA. 树形DP,求出以每个结点为LCA的 ...

  4. BZOJ 3238 差异 [后缀自动机]

    题目 一个长度为n的字符串S,令TiT_i表示它从第i个字符开始的后缀.求 ∑1≤i<j≤nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj) \sum_{1\le i 其中len(a)表 ...

  5. [BZOJ3238] [AHOI2013] 差异 - 后缀自动机

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1968  Solved: 896 [Submit][Statu ...

  6. bzoj3238: [Ahoi2013]差异(后缀自动机)

    传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...

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

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

  8. [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]

    题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...

  9. BZOJ3238 后缀自动机+推公式

    拿到题目第一步就把前面的len(Ti)+len(Tj)手算出来了 可以知道这个答案只和n有关系 为n*(n+1)*(n-1)/2 (如果不会手算On跑出来也行 问题不大) 后面求LCP就是重点了 通常 ...

最新文章

  1. 一文理清集成学习知识点(BoostingBagging)
  2. 使用pycharm调试Python代码时F8快捷键失效
  3. 页面放在哪_seo页面怎么优化?seo页面优化有哪些方法?
  4. 用wamper打开php源码_php源码该怎么设置数据库
  5. 休眠锁定模式– PESSIMISTIC_FORCE_INCREMENT锁定模式如何工作
  6. Aveva Marine 新建项目001
  7. android.app.instrumentation解析
  8. 安装运行 rovio odometry
  9. 2020-12-08
  10. 3个方法解决百度网盘限速
  11. 渗透工具环境篇——Cknife中国菜刀的使用
  12. php tp框架,TP框架
  13. 项目上线流程-实时Flink
  14. 扒一扒那些叫欧拉的定理们(一)——基本介绍和简单多面体欧拉定理
  15. 在VS中一个项目下两个以上源文件怎么通过编译
  16. HTML粘性定位,CSS:position——绝对、相对、固定、粘性定位的简单记录
  17. Android Studio更换背景图片
  18. 【小程序】384- 如何一人五天开发完复杂小程序(前端必看)
  19. C语言文件的读取和写入
  20. 【Codeforces Round #458 D.Bash and a Tough Math Puzzl】线段树

热门文章

  1. 【面向对象程序设计】侩子手游戏(Java、JavaFX)
  2. 创建和使用静态链接库
  3. CF1238E Keyboard Purchase
  4. [BZOJ4430][Nwerc2015]Guessing Camels赌骆驼
  5. h3c服务器r4900清空配置信息,H3C R4900 G3服务器HDM初始化配置
  6. 2022年武汉安全员ABC证评分标准?多少分及格呢?甘建二
  7. android新闻列表,Android中实现简单的新闻列表
  8. 工作四年,分享15个对Java 程序员有用的库
  9. outlook怎样同步服务器的文件夹,当您使用辅助在 Outlook 邮箱中的文件夹时的性能和同步问题...
  10. Go Moudle笔记