后缀自动机+dp

一个串在另一个串上跑。

先对A建出自动机,然后用B在上面跑,记录当前匹配的最大长度,每次经过一个节点记录经过次数,并加上(len-Max(par))*Right,是这个状态对答案的贡献,然后把每个节点的出现次数向par树上的祖先推一遍计算贡献。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + ;
int n, m;
ll ans;
ll sum[N], Right[N], apr[N], f[N];
int a[N], c[N];
char s1[N], s2[N];
namespace SAM
{
struct node {
int val, par;
int ch[];
} t[N];
int last = , root = , sz = ;
int nw(int x)
{
t[++sz].val = x;
return sz;
}
void extend(int c)
{
int p = last, np = nw(t[p].val + );
while(p && !t[p].ch[c]) t[p].ch[c] = np, p = t[p].par;
if(!p) t[np].par = root;
else
{
int q = t[p].ch[c];
if(t[q].val == t[p].val + ) t[np].par = q;
else
{
int nq = nw(t[p].val + );
memcpy(t[nq].ch, t[q].ch, sizeof(t[q].ch));
t[nq].par = t[q].par;
t[q].par = t[np].par = nq;
while(p && t[p].ch[c] == q) t[p].ch[c] = nq, p = t[p].par;
}
}
Right[np] = ;
last = np;
}
} using namespace SAM;
int main()
{
scanf("%s%s", s1 + , s2 + );
n = strlen(s1 + );
m = strlen(s2 + );
for(int i = ; i <= n; ++i) extend(s1[i] - 'a');
for(int i = ; i <= sz; ++i) ++c[t[i].val];
for(int i = ; i <= sz; ++i) c[i] += c[i - ];
for(int i = ; i <= sz; ++i) a[c[t[i].val]--] = i;
for(int i = sz; i; --i) Right[t[a[i]].par] += Right[a[i]];
int u = root, step = ;
for(int i = ; i <= m; ++i)
{
int c = s2[i] - 'a';
if(t[u].ch[c]) u = t[u].ch[c], ++step;
else
{
while(u && !t[u].ch[c]) u = t[u].par;
if(!u) u = root, step = ;
else
{
step = t[u].val + ;
u = t[u].ch[c];
}
}
++apr[u];
if(u != root) ans += (ll)(step - t[t[u].par].val) * Right[u];
}
for(int i = sz; i > ; --i) f[t[a[i]].par] += f[a[i]] + apr[a[i]];
for(int i = ; i <= sz; ++i) ans += f[a[i]] * (ll)(t[a[i]].val - t[t[a[i]].par].val) * Right[a[i]];
printf("%lld\n", ans);
return ;
}

最新文章

  1. CentOS操作记录
  2. MS SQLSERVER 存儲過程與緩存
  3. MySQL常用操作总结
  4. dede如何按自己写的ID进行排序
  5. 转 wince程序 中使用Listview显示图标问题 (C#) .
  6. Java-数据结构与算法-逢3减1-面向对象
  7. 用CSS3写的小案例-图片缩放隐藏内容显示
  8. java程序执行时,JVM内存
  9. 移动端Web页面问题
  10. jqery选择器
  11. LINUX下 Udev详解
  12. 【Python之基本数据类型 基本运算】
  13. js截取字符串的方法
  14. 每天CSS学习之text-shadow
  15. Python知识点整理,基础5 - 文件操作
  16. 理解Linux中的shutdown、poweroff、halt和reboot命令
  17. Python2.7-shutil
  18. adb连接不上手机的解决方案
  19. [javaSE] 网络编程(TCP,UDP,Socket特点)
  20. P2617 Dynamic Rankings

热门文章

  1. Go -- 通过GOTRACEBACK生成程序崩溃后core文件的方法(gcore gdb)
  2. 【Todo】git的fast forward &amp; git命令学习 &amp; no-ff
  3. poj2482--Stars in Your Window(扫描线)
  4. [Tools] Region commands to collapse the code by group
  5. 安卓执行机制JNI、Dalvik、ART之间的比較 。android L 改动执行机制。
  6. 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用
  7. Cg入门8:Vertex Shader - 更好的数据组织方式struct
  8. mybatis 简单项目步骤
  9. 李洪强iOS开发之- 点击屏幕遮挡键盘
  10. VMWare 14 Workstation Pro 下载与安装