MemSQL Start[c]UP 2.0 - Round 1 E - Three strings 广义后缀自动机
将三个串加进去,看每个节点在三个串中分别出现了多少次。
- #include<bits/stdc++.h>
- #define LL long long
- #define fi first
- #define se second
- #define mk make_pair
- #define PII pair<int, int>
- #define PLI pair<LL, int>
- #define ull unsigned long long
- using namespace std;
- const int N = 5e5 + ;
- const int inf = 0x3f3f3f3f;
- const LL INF = 0x3f3f3f3f3f3f3f3f;
- const int mod = 1e9 + ;
- const double eps = 1e-;
- int n, ans[N], len[];
- char s[][N];
- struct SuffixAutomaton {
- int cur, cnt, ch[N<<][], id[N<<], fa[N<<], dis[N<<], sz[N<<], c[N];
- int num[][N<<];
- SuffixAutomaton() {cur = cnt = ;}
- void init() {
- for(int i = ; i <= cnt; i++) {
- memset(ch[i], , sizeof(ch[i]));
- sz[i] = c[i] = dis[i] = fa[i] = ;
- }
- cur = cnt = ;
- }
- int extend(int p, int c) {
- cur = ++cnt; dis[cur] = dis[p]+;
- for(; p && !ch[p][c]; p = fa[p]) ch[p][c] = cur;
- if(!p) fa[cur] = ;
- else {
- int q = ch[p][c];
- if(dis[q] == dis[p]+) fa[cur] = q;
- else {
- int nt = ++cnt; dis[nt] = dis[p]+;
- memcpy(ch[nt], ch[q], sizeof(ch[q]));
- fa[nt] = fa[q]; fa[q] = fa[cur] = nt;
- for(; ch[p][c]==q; p=fa[p]) ch[p][c] = nt;
- }
- }
- sz[cur] = ;
- return cur;
- }
- void topo(int n) {
- for(int i = ; i <= cnt; i++) c[dis[i]]++;
- for(int i = ; i <= n; i++) c[i] += c[i-];
- for(int i = cnt; i >= ; i--) id[c[dis[i]]--] = i;
- }
- void solve() {
- for(int i = ; i < ; i++) {
- scanf("%s", s[i]); len[i] = strlen(s[i]);
- for(int j = , last = ; j < len[i]; j++)
- last = extend(last, s[i][j]-'a');
- }
- for(int i = ; i < ; i++) {
- for(int j = , p = ; j < len[i]; j++) {
- p = ch[p][s[i][j]-'a'];
- num[i][p]++;
- }
- }
- topo(max(len[], max(len[], len[])));
- for(int i = cnt; i >= ; i--)
- for(int j = ; j < ; j++)
- num[j][fa[id[i]]] += num[j][id[i]];
- for(int i = ; i <= cnt; i++) {
- int ret = 1ll*num[][i]*num[][i]%mod*num[][i]%mod;
- int mx = dis[i], mn = dis[fa[i]]+;
- ans[mn] = (ans[mn] + ret) % mod;
- ans[mx+] = (ans[mx+]-ret+mod)%mod;
- }
- int Len = min(len[], min(len[], len[]));
- for(int i = ; i <= Len; i++) {
- ans[i] = (ans[i] + ans[i-]) % mod;
- printf("%d ", ans[i]);
- }
- puts("");
- }
- } sam;
- int main() {
- sam.solve();
- return ;
- }
- /*
- */
MemSQL Start[c]UP 2.0 - Round 1 E - Three strings 广义后缀自动机的更多相关文章
- Codeforces Round #364 (Div. 1) (差一个后缀自动机)
B. Connecting Universities 大意: 给定树, 给定2*k个点, 求将2*k个点两两匹配, 每个匹配的贡献为两点的距离, 求贡献最大值 单独考虑每条边$(u,v)$的贡献即可, ...
- MemSQL Start[c]UP 2.0 - Round 1(无聊练手B题)
http://codeforces.com/contest/452/problem/B B. 4-point polyline time limit per test 2 seconds memo ...
- MemSQL Start[c]UP 2.0 - Round 2 - Online Round
搞到凌晨4点一个没出,要gg了. A. Golden System http://codeforces.com/contest/458/problem/A #include<cstdio> ...
- MemSQL Start[c]UP 2.0 - Round 1
A. Eevee http://codeforces.com/contest/452/problem/A 字符串水题 #include<cstdio> #include<cstrin ...
- MemSQL Start[c]UP 2.0 - Round 2
反正晚上睡不着,熬到1点开始做比赛,6个题目只做了2个题目,而且手速还比较慢,待提升空间还很大呢. A题:给定两个0,1串(len<=100000), 但是不是普通的二进制串,而是q进制串,q ...
- MemSQL Start[c]UP 2.0 - Round 1E. Three strings
题意:给3个字符串,问从1到min(l1,l2,l3)的长度的子串,找到从该位置长度为l,三个子串相同的三元组的个数 题解:把3个子串用分隔符串起来.然后分开统计每个节点在三个串中出现次数.最后乘起来 ...
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E
题意:减前面的数,加后面的数,保证最后不剩下数,加减次数要相同: 题解:emmmmm,看出是个贪心,先对价值排序,相同就对下标排序,规律是每次找第一个,然后从后往前找没有使用过的下表比他大的第一个,相 ...
- 【MemSQL Start[c]UP 3.0 - Round 1 E】Desk Disorder
[链接]h在这里写链接 [题意] 有N个人. 2N个座位. 现在告诉你这N个人它们现在的座位.以及它们想去的座位. 每个人可以去它们想去的座位或者就站在原地不动. 新的座位和旧的座位,都不允许一个座位 ...
- 【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
[链接]h在这里写链接 [题意] 在这里写题意 [题解] dp[i][0] 第i个位置,bob没有决策权 dp[i][1] 第i个位置,bob有决策权 dp[n][0] = 0 ...
随机推荐
- HTTP协议(2)-------- 网络编程
1. HTTP请求格式 做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干.HTTP协议传输的消息 ...
- HDU 4311 Meeting point-1 求一个点到其它点的曼哈顿距离之和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4311 解题报告:在一个平面上有 n 个点,求一个点到其它的 n 个点的距离之和最小是多少. 首先不得不 ...
- JS设计模式——11.适配器模式
适配器模式概述 适配器模式可用来在现有接口和不兼容的类之间进行适配.使用这种模式的对象又叫包装器(wrapper). 适配器特点 从表面看,适配器模式很像门面模式.她们都要对别的对象进行包装并改变其呈 ...
- 小白欢乐多——记ssctf的几道题目
小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...
- aarch64_n3
ntp-doc-4.2.8p10-1.fc26.noarch.rpm 2017-03-24 02:07 1.2M fedora Mirroring Project ntp-perl-4.2.8p10- ...
- HDU 6196 happy happy happy 爆搜加剪枝
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6196 题意:给你长度为n的序列,爸爸和儿子玩一个游戏,儿子先手,儿子每次都选择最左边与最右边最大的那个 ...
- 09 Command Documentation 命令文档
Command Documentation 命令文档 There is a suite of programs to build and process Go source code. Inste ...
- 美国部分科技公司创始及IPO信息
作者:Ben.Z 时间:2018-04-19 做这份统计表格的目的是为了更好地了解当下美国的IT发展,搞清楚那些耳熟能详的名词的来源. 原文是用WPS统计的,本文仅展示截图. 创始人年龄分析: 1.上 ...
- Shell脚本系列教程二: 开始Shell编程
Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...
- day03作业
---恢复内容开始--- 1.+.-.*./.%.++.-- ①正号:②加法运算:③连接符 除法是两个数相除所得的结果,取余是除法操作的余数. ++前置表示现将一个数自加然后进行赋值,++后置表示先赋 ...