loj2064[HAOI2016]找相同字符
2024-10-07 19:02:49
题意:给你两个字符串,问其中各取一个子串,有多少对相同?n<=20W。
标程:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
ll ans;
int p,np,cnt,fa[N],son[N][],tt[N],sz1[N],sz2[N],l[N],sl,tl,Cnt[N];
char a[N],b[N];
void sam(int c)
{
p=np; np=++cnt;l[np]=l[p]+;
if (son[p][c]&&l[son[p][c]]==l[p]+) {cnt--,np=son[p][c];return;}
for (;p&&!son[p][c];p=fa[p]) son[p][c]=np;
if (!p) fa[np]=;
else {
int q=son[p][c];
if (l[q]==l[p]+) fa[np]=q;
else {
int nq=++cnt;l[nq]=l[p]+;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q];fa[q]=fa[np]=nq;
for (;p&&son[p][c]==q;p=fa[p]) son[p][c]=nq;
}
}
}
int main()
{
scanf("%s%s",a+,b+);
sl=strlen(a+);tl=strlen(b+);
cnt=np=;
for (int i=;i<=sl;i++) sam(a[i]-'a'),sz1[np]++;
np=;
for (int i=;i<=tl;i++) sam(b[i]-'a'),sz2[np]++;
for (int i=;i<=cnt;i++) Cnt[l[i]]++;
for (int i=;i<=cnt;i++) Cnt[i]+=Cnt[i-];
for (int i=;i<=cnt;i++) tt[Cnt[l[i]]--]=i;
for (int i=cnt;i>=;i--)
{
int x=tt[i];
sz1[fa[x]]+=sz1[x];sz2[fa[x]]+=sz2[x];
}
for (int i=;i<=cnt;i++) ans+=(ll)sz1[i]*sz2[i]*(l[i]-l[fa[i]]);
printf("%lld\n",ans);
return ;
}
题解:后缀自动机
参考了mjy0724的做法,把两个串的后缀自动机建在一起,对于每一个节点分别统计在A/B串中的出现次数,统计sz1[i]*sz2[i]*(l[i]-l[fa[i]])。
也可以一个串建Sam,另一个串在Sam上匹配,每次统计以新加入字符为后缀的字符串的匹配情况。匹配到的Sam节点以上的节点都是该节点的后缀,都要统计,做个树上前缀和。注意一下该点内部的匹配,l=min(l,dep[p])+1。
也可以用后缀数组做,加一个分隔符,利用height数组从小到大加入。
最新文章
- 版本控制工具比较-CVS,SVN,GIT
- javaScript事件(一)事件流
- ORA-04021 timeout occurred while waiting to lock object
- iOS,XMPP本地环境搭建和框架使用
- 四大开源协议比较:BSD、Apache、GPL、LGPL (转)
- 关于js中的几个小问题。
- objective-c 条件运算符
- 使用python远程登录
- c++ 中文字符串处理方法
- Hadoop中OutputFormat解析
- XML约束图解
- 十大算法 pagerank 傅里叶变换
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)
- LeetCode--031--下一个排列(java)*
- 【CF429E】 Points and Segments(欧拉回路)
- linux shell 指令 诸如-d, -f, -e之类的判断表达式简介
- lateinit 的使用限制
- SpringBoot整合Mybatis完整详细版
- [转]JS判断字符串是否为json数据
- (转载)o(1), o(n), o(logn), o(nlogn) 时间复杂度
热门文章
- Codeforces 362E 费用流
- 转帖 移动前端开发之viewport的深入理解
- SpringMvc获取前端的数据@RequestBody请求体/@PathVaribale/@RequestParam【支持Ajax】
- java--ArrayList,LinkedList应用比较
- securityDemo依赖
- Linux安装系统
- UNP学习第四章tcp
- 集合类中的Collection接口实现类
- Python基础教程(005)--为什么要学习Python?
- [CSP-S模拟测试]:E(贪心)