BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp
http://www.lydsy.com/JudgeOnline/problem.php?id=3238
就算是全局变量,也不要忘记,初始化(吐血)。
长得一副lca样,没想到是个树形dp(小丫头还有两幅面孔呢)。
看代码实现吧,不大容易口头解释,把加的和减的分开算就可以了,减去的通过倒着建sam(相当于建一棵后缀树),然后算每个len取的次数实现,注意树归中一些避免重复操作。
- /**************************************************************
- Problem: 3238
- User: 137shoebills
- Language: C++
- Result: Accepted
- Time:3816 ms
- Memory:130688 kb
- ****************************************************************/
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<map>
- using namespace std;
- const int maxn=;
- char ch1[maxn]={};
- int siz;
- struct nod{
- int sig[];
- int f,len;
- }t[maxn*];int tot=,la=;
- void add(int z){
- int x=++tot;int i=la;
- t[x].len=t[la].len+;
- for(;i&&!t[i].sig[z];i=t[i].f)
- t[i].sig[z]=x;
- if(!i)t[x].f=;
- else{
- int p=t[i].sig[z];
- if(t[p].len==t[i].len+)t[x].f=p;
- else{
- int y=++tot;
- t[y]=t[p];t[y].len=t[i].len+;
- t[x].f=t[p].f=y;
- for(;i&&t[i].sig[z]==p;i=t[i].f)
- t[i].sig[z]=y;
- }
- }
- la=x;
- }
- struct node{
- int y,next;
- }e[maxn*];int cnt=;
- int head[maxn*]={};
- long long dp[maxn*]={},sum=;
- void init(int x,int y){e[++cnt].y=y;e[cnt].next=head[x];head[x]=cnt;}
- void dfs(int x){
- int y;
- long long num=dp[x]*dp[x];
- for(int i=head[x];i;i=e[i].next){
- y=e[i].y;
- dfs(y);dp[x]+=dp[y];
- num+=dp[y]*dp[y];
- }
- sum+=(dp[x]*dp[x]-num)*t[x].len;
- }
- long long solve(){
- int j=;
- for(int i=siz;i>=;i--){
- j=t[j].sig[ch1[i]-'a'];
- dp[j]++;
- }
- for(int i=;i<=tot;i++)
- init(t[i].f,i);
- dfs();
- return sum;
- }
- int main(){
- memset(t,,sizeof(t));
- scanf("%s",ch1+);siz=strlen(ch1+);
- for(int i=siz;i>=;i--)add((int)(ch1[i]-'a'));
- long long ans=;
- for(int i=;i<=siz;i++)ans+=(long long)i*(siz-);
- printf("%lld\n",ans-solve());
- return ;
- }
BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp的更多相关文章
- BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)
题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...
- 【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: 2512 Solved: 1140[Submit][Status ...
- BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
后缀自动机的parent树就是反串的后缀树. 所以只需要反向构建出后缀树,就可以乱搞了. #include <cstdio> #include <cstring> #inclu ...
- bzoj 3238: [Ahoi2013]差异【SAM+树形dp】
首先只有lcp(i,j)需要考虑 因为SAM的parent树是后缀的前缀的最长公共后缀(--),所以把这个串倒过来建SAM,这样就变成了求两个前缀的最长公共后缀,长度就是这两个前缀在parent树上的 ...
- 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 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】3527: [Zjoi2014]力 FFT
[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...
- java对象与json互转
package com.liveyc; import java.io.StringWriter; import org.junit.Test; import com.fasterxml.jackson ...
- [洛谷P1823]音乐会的等待 题解(单调栈)
[洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...
- 2018中国科大自主测试-B卷部分试题
数学部分 z = e^{\frac{2i\pi}{3}}, 求z^{2018}. \sin(2x) = \frac 35, 求\frac{\tan(x+15^{\circ})}{\tan(x-15^{ ...
- 牛客网习题剑指offer之数值的整数次方
分析: 要考虑到exponent为0和负数的情况. 如果base是0并且exponent是负数的时候呢?那就发生除0的情况了. AC代码: public class Solution { public ...
- 33、re的match和search区别?
1.match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配:2.也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功 ...
- L - SOS Gym - 101775L 博弈
题目链接:https://cn.vjudge.net/contest/274151#problem/L 题目大意:给你一个1*n的方格,两个人轮流放字母,每一次可以放"S"或者&q ...
- linux 查看内存和cpu占用比较多的进程
1.可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 102. 可以使用一下命令查使用CPU最多的10个进程 ps ...
- [Leetcode] N-Queens 系列
N-Queens 系列题解 题目来源: N-Queens N-Queens II N-Queens The n-queens puzzle is the problem of placing n qu ...
- Pandas Installation
1. 将环境变量PATH中加入C:\python2*\Scripts 或者 C:\Program Files\Python 3.5\Scripts 2. 进入pip.exe所在的目录:C:\Progr ...