BZOJ 3238 [Ahoi2013]差异(后缀自动机)
【题目链接】 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统计一下即可。
【代码】
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int N=1000010;
- struct SAM{
- char s[N];
- int p,q,np,nq,cnt,lst,a[N][26],l[N],f[N],size[N],tot;
- int Tr(char c){return c-'a';}
- SAM(){cnt=0;lst=++cnt;}
- void extend(int c){
- p=lst;np=lst=++cnt;l[np]=l[p]+1;size[np]=1;
- while(!a[p][c]&&p)a[p][c]=np,p=f[p];
- if(!p)f[np]=1;
- else{
- q=a[p][c];
- if(l[p]+1==l[q])f[np]=q;
- else{
- nq=++cnt;l[nq]=l[p]+1;
- memcpy(a[nq],a[q],sizeof(a[q]));
- f[nq]=f[q]; f[np]=f[q]=nq;
- while(a[p][c]==q)a[p][c]=nq,p=f[p];
- }
- }
- }
- vector<int> v[N];
- void BuildTree(){
- scanf("%s",s+1);
- int len=strlen(s+1);
- for(int i=len;i;i--)extend(Tr(s[i]));
- for(int i=2;i<=cnt;i++)v[f[i]].push_back(i);
- }
- long long res;
- void Dfs(int x,int fx){
- for(int i=0;i<v[x].size();i++){
- int y=v[x][i];
- Dfs(y,x); size[x]+=size[y];
- }l[x]-=l[fx];
- res=res-(long long)size[x]*(size[x]-1)*l[x];
- }
- void ShowResult(){
- int len=strlen(s+1);
- res=(long long)(len-1)*len*(len+1)/2;
- for(int i=0;i<v[1].size();i++)Dfs(v[1][i],1);
- printf("%lld\n",res);
- }
- }sam;
- int main(){
- sam.BuildTree();
- sam.ShowResult();
- return 0;
- }
BZOJ 3238 [Ahoi2013]差异(后缀自动机)的更多相关文章
- BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2512 Solved: 1140[Submit][Status ...
- BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
后缀自动机的parent树就是反串的后缀树. 所以只需要反向构建出后缀树,就可以乱搞了. #include <cstdio> #include <cstring> #inclu ...
- BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp
http://www.lydsy.com/JudgeOnline/problem.php?id=3238 就算是全局变量,也不要忘记,初始化(吐血). 长得一副lca样,没想到是个树形dp(小丫头还有 ...
- BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)
题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...
- bzoj 3238: [Ahoi2013]差异 -- 后缀数组
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 一行,一个字符串S Output 一行,一个 ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- 【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)$ 先考虑 ...
- bzoj 3238 Ahoi2013 差异
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2357 Solved: 1067[Submit][Status ...
- ●BZOJ 3238 [Ahoi2013]差异
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...
随机推荐
- Spring Boot1.5X升级到2.0
配置文件 大量的Servlet专属的server.* properties被移到了server.servlet下 拦截器 public class MyWebMvcConfigurerAdapter ...
- jquery easyui 扩展验证
$.extend($.fn.validatebox.defaults.rules, { idcard : {// 验证身份证 validator : function(value) ...
- [Ubuntu 14.04] 创建可以用于Android的WIFI热点
Ubuntu的网络管理为创建Wifi热点提供了方便,可是因为它用了ad-hoc网络,所以其创建的Wifi又不能让Android系统使用.这篇文字就是为了解决这个问题 1.Install AP-Host ...
- rabbitmq之后台管理和用户设置(三)
前言 前面介绍了erlang环境的安装和rabbitmq环境安装,接下来介绍rabbitmq的web管理和用户设置. 启用后台管理插件 通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等. ...
- nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查报403错误【转】
在nginx.conf配置文件中 在server添加 location /nstatus { check_status; access_log off; #allow 192.168.2.11; #d ...
- SDN核心技术剖析和实战指南---读书笔记
第一章 SDN定义如下: SDN是一种新兴的基于软件的网络架构及技术,其最大的特点在于具有松耦合的控制平面与数据平面.支持集中化的网络状态控制.实现底层网络设施对上层应用的透明. SDN和NFV: O ...
- C基础 旋转数组查找题目
前言 - 引言 题目: 一类有序数组旋转查值问题. 例如: 有序数组 [ , , , , , , , , ] 旋转后为 [ , , , , , , , , ] 如何从中找出一个值索引, not fou ...
- J2V8 For Android
J2V8是基于Google的JavaScript引擎V8的Java开源项目,实现Java和JavaScript的相互调用.并对Android平台提供支持,最新版本提供了aar格式的类库包方便Andro ...
- java 多线程总结篇2之——Thread类及常用函数
此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...
- [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息
我最近需要一个用户地域检测来设置用户的默认区域和货币.由 Daniel Stainback 创建的 torann/geoip 很好地满足为Laravel 5 项目提供 GeoIP 服务的要求. 这个 ...