bzoj4566 / P3181 [HAOI2016]找相同字符】的更多相关文章

P3181 [HAOI2016]找相同字符 后缀自动机 (正解应是广义后缀自动机) 并不会广义后缀自动机. 然鹅可以用普通的后缀自动机.   我们先引入一个问题:算出从一个串内取任意两个不重合子串完全相同的方案数. 显然,对于每个点$w$,$tot+=siz[w]*(siz[w]-1)/2*(len[w]-len[fa[w]])$ $siz[w]$表示该点对应子串出现次数 那么答案即为$tot_{a+b}-tot_a-tot_b$ 计算$tot_{a+b}$时在$a,b$间插入一个特殊字符即可.…
[BZOJ4566][HAOI2016]找相同字符 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 其中\(1\leq|s1|,|s2|\leq n\) 题解 其实和这题差不多. 根据后缀数组常用套路,将将\(s1,s2\)用一个未曾出现的字符连起来 和上面那题一样的方法 算出来一个答案 然后减去分别左右两字符串选的贡献就好啦 代码 #include <iostream> #include <cstdio…
[BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为n1,n2.1 <=n1, n2<= 200000,字符串中只有小写字母 Output 输出一个整数表示答案 Sample Input aabb bbaa Sample Output 10 题解:本题跟差异那道题很相似,理论上可以直接一遍sa搞…
https://www.lydsy.com/JudgeOnline/problem.php?id=4566 https://www.luogu.org/problemnew/show/P3181 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 广义后缀自动机,两个串各处理他们的size(或right?),然后对结点l排序,对于每个结点他们的size相乘即为答案. ……等等怎么WA了啊. 比如: aba abaa 这组数…
题面 Bzoj Sol 两个串拼在一起后求出后缀数组 然后显然的\(n^2\)暴力,就是直接枚举求\(LCP\) 又由于扫的时候是对\(height\)取\(min\) 那么可以用单调栈维护每一段的贡献相同的 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long…
题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt[s][1]*cnt[s][2]\] 在\(SAM\)这种把多个串用一个点表示的东西里,答案就变成了这个 \[\sum cnt[s][1] * cnt[s][2] * (len[fa[s]]-len[s])\] 其中的\(cnt\)求法,听说好像可以两个串隔开求?但是我不太会.学了一下用广义\(SA…
思路 广义SAM 把两个字符串建成广义SAM,然后统计两个SAM中相同节点的endpos大小乘积即可 记得开long long 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int MAXN = 800100; int endpos[MAXN][2],trans[MAXN][26],suflink…
题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数. 题解:建广义$SAM$,对每个点求出在第一个串中出现次数和第二个串中出现次数,乘起来就行了 卡点:无 C++ Code: #include <algorithm> #include <cstdio> #include <cstring> #define maxn 200010 namespace SAM { #define N (maxn << 2) int R[N], n…
BZOJ4566 [Haoi2016]找相同字符 给定两个字符串\(s和t\),要求找出两个字符串中所有可以相互匹配的子串对的数量 首先考虑可以怎么做,我们可以枚举\(t\)串的前缀\(t'\),然后找\(t'\)的后缀能和\(s\)串匹配上的数量 这部分做法和和求\(LCS\)差不多 我们首先根据\(s\)串建\(SAM\),然后计算出每个状态的\(endpos\)集合大小,我们现在想知道以当前状态\(u\)的最长串为后缀最多可以匹配多少子串,那么当前状态可以匹配的数量就是\((len[u]-…
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1212  Solved: 694[Submit][Status][Discuss] Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为n1,n2.1 <=n1, n2<= 200000,字符串中只有小写字…