bzoj3238 [Ahoi2013]差异 后缀自动机
这个题虽然看起来比较麻烦,但其实有一点搞懂了就好做了
每一个后缀的前缀的lcp一定是这个串里的子串,
对于全部子串,如果它不是后缀,那一定可以找到这个串对应的后缀,
而这样的子串和后缀子串是没有区别的,因为他们出现的位置相同,而后缀自动机记录每个子串的出现次数,
这个子串和以它开头所在的后缀相同的都是这个子串,由于SAM的高压性,这个子串余剩的部分一定不会与它所在后缀相同(不然会被并成一个点),
所以,由于对答案有影响的只有次数>=2的串,而次数>=2一定是开始位置不一样的,所对应的>=2个后缀也是起始位置不同的后缀,他们的一部分公共前缀就是这个子串,且这>=2个后缀的公共前缀也不会再其他地方算过,所以这就是lcp。
然后贡献就是C(2,n)*(len(o)-len(fa))
答案就是(n-1)((n+1)*n/2)-贡献和
码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
char str[500005];
int ch[1000005][27],l[1000005],fu[1000005],cnt,p,np,q,nq;
long long ans,len,sz[1000005];
vector<int>v[1000005];
void jia(int o)
{int i,np=++cnt;l[np]=l[p]+1;while(p&&ch[p][o]==0)ch[p][o]=np,p=fu[p];if(p==0)fu[np]=1;else{q=ch[p][o];if(l[p]+1!=l[q]){int nq=++cnt;l[nq]=l[p]+1;for(i=0;i<=26;i++)ch[nq][i]=ch[q][i];fu[nq]=fu[q];fu[q]=fu[np]=nq;for(;ch[p][o]==q;p=fu[p])ch[p][o]=nq; }else fu[np]=q;}sz[np]++;p=np;
}
void dfs(int o,int fa)
{int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];dfs(nd,o);sz[o]+=sz[nd]; } ans+=(l[o]-l[fa])*(sz[o]*(sz[o]-1)/2)*2;
}
int main()
{int i,o;scanf("%s",str);cnt=p=1;len=strlen(str); for(i=0;i<len;i++){jia(str[i]-'a'); }
for(i=2;i<=cnt;i++)
v[fu[i]].push_back(i);dfs(1,0);printf("%lld",(len-1)*((1+len)*len/2)-ans);
}
bzoj3238 [Ahoi2013]差异 后缀自动机相关推荐
- [BZOJ3238] [AHOI2013] 差异 - 后缀自动机
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1968 Solved: 896 [Submit][Statu ...
- bzoj3238 [Ahoi2013]差异 后缀自动机
题意:给出一个串,求其中任意两个字串的lcp的总和. 我们可以对于这个串建一颗后缀自动机,实际上,他的parent边树就是一颗后缀树,我们在后缀树上统计答案,设f表示right集合的大小,可以理解为后 ...
- [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]
题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...
- 【bzoj3238】差异 后缀自动机
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题解] 题上所给公式可以化为 其中: =1×(n-1)+2×(n-2)+3×(n- ...
- BZOJ3238[Ahoi2013]差异
BZOJ3238[Ahoi2013]差异 题目描述 n<=500000n<=500000n,都是小写字母 输入 一行,一个字符串S 输出 一行,一个整数,表示所求值 Solution 公式 ...
- bzoj3238: [Ahoi2013]差异(后缀自动机)
传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...
- BZOJ3238: [Ahoi2013]差异
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 4840 Solved: 2298 [Submit][Stat ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 2326 Solved: 1054 [Submit][Stat ...
- BZOJ 3238 差异 [后缀自动机]
题目 一个长度为n的字符串S,令TiT_i表示它从第i个字符开始的后缀.求 ∑1≤i<j≤nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj) \sum_{1\le i 其中len(a)表 ...
最新文章
- python36块砖36人搬算法_剑指offer python实现 66道算法题
- boost::fusion::set用法的测试程序
- 你可能不知道的 10 条 SQL 技巧
- LightOJ 1393 Crazy Calendar(博弈)题解
- 【Scrapy】Unsupported major.minor version 52.0 [duplicate]
- 训练日志 2018.9.5
- 手机python编程文件如何转文档_Python 开发者面向文档编程的正确姿势
- 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的在线考试系统
- 使用windows命令和iconv.exe批量转换文件编码
- Scintilla教程(1): 入门介绍
- Android 开发中版本兼容性问题
- harmonyos蓝牙,鸿蒙OS 蓝牙概述
- require.context()的用法
- 深度学习:乳腺检测abnormality detection in mammography +CAM
- 阿里云IoT平台APP配网入口
- 小学五年级计算机教学论文,人教版小学五年级数学教学论文
- 双轴反作用轮定点自平衡杆动力学模型
- (附源码)计算机毕业设计ssm爱音乐网站
- 海思16DV300系统搭建过程
- 水溶性CY3.5-马来酰亚胺,Sulfo-Cyanine3.5 maleimide
热门文章
- 红橙Darren视频笔记 万能Dialog builder设计模式
- Android线程池的简单使用
- 关于如何在word中写公式的方法
- 三星Samsung笔记本电脑开机进入BIOS的方法与BIOS设置全功能菜单(F2)
- Servlet萌新基础
- day2 java的数据转换与强制转换
- 赋值运算符(AssignmentOperator)
- knife4j导出html有误,knife4j无法生成完整的响应说明
- 台式计算机光标时不时跳动,解决方案:如何解决联想笔记本触摸板上的光标跳动?...
- 质数因子 java_质数因子