题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数。

题解:建广义$SAM$,对每个点求出在第一个串中出现次数和第二个串中出现次数,乘起来就行了

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#include <cstring>
#define maxn 200010 namespace SAM {
#define N (maxn << 2)
int R[N], nxt[N][26], fail[N];
int lst = 1, idx = 1, sz[N][2];
void append(char __ch, int op) {
int ch = __ch - 'a';
int p = lst, np = lst = ++idx; R[np] = R[p] + 1; sz[np][op] = 1;
for (; p && !nxt[p][ch]; p = fail[p]) nxt[p][ch] = np;
if (!p) fail[np] = 1;
else {
int q = nxt[p][ch];
if (R[q] + 1 == R[p]) fail[np] = q;
else {
int nq = ++idx;
fail[nq] = fail[q], R[nq] = R[p] + 1, fail[q] = fail[np] = nq;
std::copy(nxt[q], nxt[q] + 26, nxt[nq]);
for (; p && nxt[p][ch] == q; p = fail[p]) nxt[p][ch] = nq;
}
}
} int head[N], cnt;
struct Edge {
int to, nxt;
} e[N];
inline void addedge(int a, int b) {
e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
} long long ans;
void dfs(int u) {
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
dfs(v);
sz[u][0] += sz[v][0], sz[u][1] += sz[v][1];
ans += static_cast<long long> (R[v] - R[u]) * sz[v][0] * sz[v][1];
}
}
long long work() {
for (int i = 2; i <= idx; i++) addedge(fail[i], i);
dfs(1);
return ans;
}
#undef N
} int n;
char s[maxn];
int main() {
scanf("%s", s); n = strlen(s);
for (int i = 0; i < n; i++) SAM::append(s[i], 0);
scanf("%s", s); n = strlen(s); SAM::lst = 1;
for (int i = 0; i < n; i++) SAM::append(s[i], 1);
printf("%lld\n", SAM::work());
return 0;
}

  

最新文章

  1. NDK学习4: Eclipse HelloWorld
  2. Objective-c的内存管理MRC与ARC
  3. NameNode HA滚动升级方案
  4. (原)nginx 源码编译
  5. 2017JAVA必读书籍
  6. C# 调用FFmpeg 根据图片合成视频
  7. 【Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西】玛萨玛索男装网购商城
  8. $smary模板缓存
  9. [转] (CQRS)命令和查询责任分离架构模式(一) 之 什么是CQRS
  10. C语言第一次博客作业—输入输出
  11. VUE项目中使用mint-ui框架总结
  12. python文件
  13. 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A
  14. RNN的深入理解
  15. nodejs 模板引擎ejs的使用
  16. Redhat6.5安装DB2 Express-C版本
  17. sysbench 压力测试工具
  18. [日常] PHP设置 include_path 配置选项
  19. ie6 javascript:void(0);
  20. 20165202 实验一 Java开发环境的熟悉

热门文章

  1. NSNull Crash处理 (NullSafe 的原理)
  2. 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递
  3. Selenium 入门到精通系列:六
  4. 使用jenkins构建一个maven项目
  5. 学好三角学(函数) — SWIFT和JAVASCRIPT游戏开发的必备技能 iFIERO.com
  6. 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
  7. 181. Flip Bits【LintCode, by java】
  8. CSP201612-1:中间数
  9. 数独:dfs+剪枝+位运算+排除冗余+优化搜索顺序(未完)
  10. lintcode-16-带重复元素的排列