[洛谷P3181][HAOI2016]找相同字符
2024-09-29 06:22:49
题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数。
题解:建广义$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;
}
最新文章
- NDK学习4: Eclipse HelloWorld
- Objective-c的内存管理MRC与ARC
- NameNode HA滚动升级方案
- (原)nginx 源码编译
- 2017JAVA必读书籍
- C# 调用FFmpeg 根据图片合成视频
- 【Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西】玛萨玛索男装网购商城
- $smary模板缓存
- [转] (CQRS)命令和查询责任分离架构模式(一) 之 什么是CQRS
- C语言第一次博客作业—输入输出
- VUE项目中使用mint-ui框架总结
- python文件
- 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A
- RNN的深入理解
- nodejs 模板引擎ejs的使用
- Redhat6.5安装DB2 Express-C版本
- sysbench 压力测试工具
- [日常] PHP设置 include_path 配置选项
- ie6 javascript:void(0);
- 20165202 实验一 Java开发环境的熟悉
热门文章
- NSNull Crash处理 (NullSafe 的原理)
- 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递
- Selenium 入门到精通系列:六
- 使用jenkins构建一个maven项目
- 学好三角学(函数) — SWIFT和JAVASCRIPT游戏开发的必备技能 iFIERO.com
- 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
- 181. Flip Bits【LintCode, by java】
- CSP201612-1:中间数
- 数独:dfs+剪枝+位运算+排除冗余+优化搜索顺序(未完)
- lintcode-16-带重复元素的排列