题意:给你两个字符串,问其中各取一个子串,有多少对相同?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数组从小到大加入。

最新文章

  1. 版本控制工具比较-CVS,SVN,GIT
  2. javaScript事件(一)事件流
  3. ORA-04021 timeout occurred while waiting to lock object
  4. iOS,XMPP本地环境搭建和框架使用
  5. 四大开源协议比较:BSD、Apache、GPL、LGPL (转)
  6. 关于js中的几个小问题。
  7. objective-c 条件运算符
  8. 使用python远程登录
  9. c++ 中文字符串处理方法
  10. Hadoop中OutputFormat解析
  11. XML约束图解
  12. 十大算法 pagerank 傅里叶变换
  13. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)
  14. LeetCode--031--下一个排列(java)*
  15. 【CF429E】 Points and Segments(欧拉回路)
  16. linux shell 指令 诸如-d, -f, -e之类的判断表达式简介
  17. lateinit 的使用限制
  18. SpringBoot整合Mybatis完整详细版
  19. [转]JS判断字符串是否为json数据
  20. (转载)o(1), o(n), o(logn), o(nlogn) 时间复杂度

热门文章

  1. Codeforces 362E 费用流
  2. 转帖 移动前端开发之viewport的深入理解
  3. SpringMvc获取前端的数据@RequestBody请求体/@PathVaribale/@RequestParam【支持Ajax】
  4. java--ArrayList,LinkedList应用比较
  5. securityDemo依赖
  6. Linux安装系统
  7. UNP学习第四章tcp
  8. 集合类中的Collection接口实现类
  9. Python基础教程(005)--为什么要学习Python?
  10. [CSP-S模拟测试]:E(贪心)