【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3238

【题目大意】

  给出一个串,设T[i]表示从第i位开始的后缀,
  求sum(len(T[i])+len(T[j])-2*lcp(T[i],T[j]))

【题解】

  根据反串的后缀自动机建立后缀树,  
  则两点的LCA在自动机中的length就是他们的LCP,
  树形DP统计一下即可。

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <vector>
  5. using namespace std;
  6. const int N=1000010;
  7. struct SAM{
  8. char s[N];
  9. int p,q,np,nq,cnt,lst,a[N][26],l[N],f[N],size[N],tot;
  10. int Tr(char c){return c-'a';}
  11. SAM(){cnt=0;lst=++cnt;}
  12. void extend(int c){
  13. p=lst;np=lst=++cnt;l[np]=l[p]+1;size[np]=1;
  14. while(!a[p][c]&&p)a[p][c]=np,p=f[p];
  15. if(!p)f[np]=1;
  16. else{
  17. q=a[p][c];
  18. if(l[p]+1==l[q])f[np]=q;
  19. else{
  20. nq=++cnt;l[nq]=l[p]+1;
  21. memcpy(a[nq],a[q],sizeof(a[q]));
  22. f[nq]=f[q]; f[np]=f[q]=nq;
  23. while(a[p][c]==q)a[p][c]=nq,p=f[p];
  24. }
  25. }
  26. }
  27. vector<int> v[N];
  28. void BuildTree(){
  29. scanf("%s",s+1);
  30. int len=strlen(s+1);
  31. for(int i=len;i;i--)extend(Tr(s[i]));
  32. for(int i=2;i<=cnt;i++)v[f[i]].push_back(i);
  33. }
  34. long long res;
  35. void Dfs(int x,int fx){
  36. for(int i=0;i<v[x].size();i++){
  37. int y=v[x][i];
  38. Dfs(y,x); size[x]+=size[y];
  39. }l[x]-=l[fx];
  40. res=res-(long long)size[x]*(size[x]-1)*l[x];
  41. }
  42. void ShowResult(){
  43. int len=strlen(s+1);
  44. res=(long long)(len-1)*len*(len+1)/2;
  45. for(int i=0;i<v[1].size();i++)Dfs(v[1][i],1);
  46. printf("%lld\n",res);
  47. }
  48. }sam;
  49. int main(){
  50. sam.BuildTree();
  51. sam.ShowResult();
  52. return 0;
  53. }

BZOJ 3238 [Ahoi2013]差异(后缀自动机)的更多相关文章

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

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

  2. BZOJ 3238 [Ahoi2013]差异 ——后缀自动机

    后缀自动机的parent树就是反串的后缀树. 所以只需要反向构建出后缀树,就可以乱搞了. #include <cstdio> #include <cstring> #inclu ...

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

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

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

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

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

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

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

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

  7. 【BZOJ 3238】差异 后缀自动机+树形DP

    题意 给定字符串,令$s_i$表示第$i$位开始的后缀,求$\sum_{1\le i < j \le n} len(s_i)+len(s_j)-2\times lcp(s_i,s_j)$ 先考虑 ...

  8. bzoj 3238 Ahoi2013 差异

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

  9. ●BZOJ 3238 [Ahoi2013]差异

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

随机推荐

  1. Spring Boot1.5X升级到2.0

    配置文件 大量的Servlet专属的server.* properties被移到了server.servlet下 拦截器 public class MyWebMvcConfigurerAdapter ...

  2. jquery easyui 扩展验证

    $.extend($.fn.validatebox.defaults.rules, {  idcard : {// 验证身份证          validator : function(value) ...

  3. [Ubuntu 14.04] 创建可以用于Android的WIFI热点

    Ubuntu的网络管理为创建Wifi热点提供了方便,可是因为它用了ad-hoc网络,所以其创建的Wifi又不能让Android系统使用.这篇文字就是为了解决这个问题 1.Install AP-Host ...

  4. rabbitmq之后台管理和用户设置(三)

    前言 前面介绍了erlang环境的安装和rabbitmq环境安装,接下来介绍rabbitmq的web管理和用户设置. 启用后台管理插件 通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等. ...

  5. nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查报403错误【转】

    在nginx.conf配置文件中 在server添加 location /nstatus { check_status; access_log off; #allow 192.168.2.11; #d ...

  6. SDN核心技术剖析和实战指南---读书笔记

    第一章 SDN定义如下: SDN是一种新兴的基于软件的网络架构及技术,其最大的特点在于具有松耦合的控制平面与数据平面.支持集中化的网络状态控制.实现底层网络设施对上层应用的透明. SDN和NFV: O ...

  7. C基础 旋转数组查找题目

    前言 - 引言 题目: 一类有序数组旋转查值问题. 例如: 有序数组 [ , , , , , , , , ] 旋转后为 [ , , , , , , , , ] 如何从中找出一个值索引, not fou ...

  8. J2V8 For Android

    J2V8是基于Google的JavaScript引擎V8的Java开源项目,实现Java和JavaScript的相互调用.并对Android平台提供支持,最新版本提供了aar格式的类库包方便Andro ...

  9. java 多线程总结篇2之——Thread类及常用函数

    此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...

  10. [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息

    我最近需要一个用户地域检测来设置用户的默认区域和货币.由 Daniel Stainback 创建的 torann/geoip  很好地满足为Laravel 5 项目提供 GeoIP 服务的要求. 这个 ...