博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.4566.[HAOI2016]找相同字符(后缀自动机)
阅读量:4649 次
发布时间:2019-06-09

本文共 1214 字,大约阅读时间需要 4 分钟。

做这种题终于不用写SA+二分/set/单调栈...了。。

\(Description\)

给定两个字符串,求它们有多少个相同子串。相同串的位置不同算多个。

\(Solution\)

对一个串建SAM。因为要统计不同位置个数,所以匹配一个点的贡献为\((val[i]=(len[i]-len[fa[i]])*|right[i]|)+val[fa[i]]+val[fa[fa[i]]]...\)

然后另一个串在SAM上走。维护当前已匹配的长度l,则当前贡献为\(val[fa[i]]+(l-len[fa[i]])*|right[i]|\)

//52776kb   1500ms#include 
#include
#include
#define gc() getchar()typedef long long LL;const int N=4e5+5;struct Suffix_Automaton{ int las,tot,fa[N],son[N][26],len[N],A[N],tm[N],right[N]; LL val[N]; char s[N]; void Insert(int c) { int np=++tot,p=las; len[las=np]=len[p]+1, right[np]=1; for(; p&&!son[p][c]; p=fa[p]) son[p][c]=np; if(!p) fa[np]=1; else { int q=son[p][c]; if(len[q]==len[p]+1) fa[np]=q; else { int nq=++tot; len[nq]=len[p]+1; memcpy(son[nq],son[q],sizeof son[q]); fa[nq]=fa[q], fa[q]=fa[np]=nq; for(; son[p][c]==q; p=fa[p]) son[p][c]=nq; } } } void Build() { las=tot=1; scanf("%s",s); int l=strlen(s); for(int i=0; i

转载于:https://www.cnblogs.com/SovietPower/p/9241813.html

你可能感兴趣的文章
Sql Server数据库备份和恢复:原理篇
查看>>
fafu oj 1266 数数
查看>>
日期和时间模块
查看>>
开发系列:03、Spark Streaming Custom Receivers(译)
查看>>
fixed与sticky的区别
查看>>
keil C51 例子
查看>>
修改hosts文件在本地使域名解析到指定IP
查看>>
Gym 101147J Whistle's New Car(dfs)
查看>>
poj 3669 Meteor Shower
查看>>
MVC后台数据赋值给前端JS对象
查看>>
win7、offcie 2010是否激活查看方法
查看>>
C#获取本执行程序所在的当前路径
查看>>
6种字符串数组的java排序 (String array sort)
查看>>
基于EasyNetQ的RabbitMQ封装类
查看>>
ThreadLocal 在web环境下使用的边界问题
查看>>
github ssl验证跳过
查看>>
Linux下使用wget下载FTP服务器文件
查看>>
Java基础 【Arrays 类的使用】
查看>>
MPI 环境搭建问题-运行程序闪退
查看>>
(数据科学学习手札05)Python与R数据读入存出方式的总结与比较
查看>>