BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
3238: [Ahoi2013]差异
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 2512 Solved: 1140
[Submit][Status][Discuss]
Description
Input
一行,一个字符串S
Output
一行,一个整数,表示所求值
后缀数组看这里 http://www.cnblogs.com/candy99/p/6250732.html
反串建SAM然后Parent Tree就是后缀树了
后缀树上两点的LCP就是LCA啊
然后树形DP,没必要显示建树,直接基数排序倒推行了
状态u作为LCA的时候,就是u的不同子树v的|Right|两两相乘的和
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <cmath>
- using namespace std;
- const int N=1e6+;
- typedef long long ll;
- int n,d[N];
- char s[N];
- struct State{
- int ch[],par,val;
- }t[N];
- int sz,root,last;
- inline int nw(int _){t[++sz].val=_;return sz;}
- inline void iniSAM(){sz=;root=last=nw();}
- void extend(int c){
- int p=last,np=nw(t[p].val+); d[np]=;
- for(;p&&!t[p].ch[c];p=t[p].par) t[p].ch[c]=np;
- if(!p) t[np].par=root;
- else{
- int q=t[p].ch[c];
- if(t[q].val==t[p].val+) t[np].par=q;
- else{
- int nq=nw(t[p].val+);
- memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch));
- t[nq].par=t[q].par;
- t[q].par=t[np].par=nq;
- for(;p&&t[p].ch[c]==q;p=t[p].par) t[p].ch[c]=nq;
- }
- }
- last=np;
- }
- int c[N],a[N];
- void RadixSort(){
- for(int i=;i<=sz;i++) c[t[i].val]++;
- for(int i=;i<=n;i++) c[i]+=c[i-];
- for(int i=sz;i>=;i--) a[c[t[i].val]--]=i;
- }
- ll dp(){
- ll _=;
- for(int i=sz;i>=;i--){
- int v=a[i],u=t[v].par;
- _+=(ll)t[u].val*d[u]*d[v];
- d[u]+=d[v];
- }
- return _;
- }
- void solve(){
- ll ans=(ll)n*(n+)*(n-)/;
- iniSAM();
- for(int i=;i<=n;i++) extend(s[i]-'a');
- RadixSort();
- printf("%lld",ans-*dp());
- }
- int main(int argc, const char * argv[]) {
- freopen("in","r",stdin);
- scanf("%s",s+);
- n=strlen(s+);
- reverse(s+,s++n);
- solve();
- return ;
- }
BZOJ 3238: [Ahoi2013]差异 [后缀自动机]的更多相关文章
- 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 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...
- ●BZOJ 3238 [Ahoi2013]差异
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...
随机推荐
- 移动App,AJAX异步请求,实现简单的增、删、改、查
用ajax发异步请求时,要注意url."AppServer"为后台项目名,"LoginServlet.action"为web.xml中的<url-patt ...
- 设置Sql server用户对表、视图、存储过程、架构的增删改查权限
根据数据库Schema限制用户对数据库的操作行为 授予Shema dbo下对象的定义权限给某个用户(也就是说该用户可以修改架构dbo下所有表/视图/存储过程/函数的结构) use [Your DB N ...
- 修改nopCommerce中的实体
对已有实体增加一个属性(对Category增加一个SomeNewProperty) 最近在研究nopcommerce,这里是对官网上文档的学习 ...
- tp5命名空间
- sublime 中HTML快捷键
- VisualSVN Server的配置和使用方法
VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端 ...
- base64是啥原理
Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节可表 ...
- dede的pagelist标签的listsize数字属性详解
转载▼http://blog.sina.com.cn/s/blog_a4f3bd4e01012c8n.html dede的pagelist标签的listsize数字属性详解.见远seo经常用织梦搭建各 ...
- JSP页面中的pageEncoding和contentType的区别
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> pag ...
- 开地址哈希表(Hash Table)的原理描述与冲突解决
在开地址哈希表中,元素存放在表本身中.这对于某些依赖固定大小表的应用来说非常有用.因为不像链式哈希表在每个槽位上有一个"桶"来存储冲突的元素,所以开地址哈希表需要通过另一种方法来解 ...