首页 > TAG信息列表 > 弦论

【题解】[TJOI2015]弦论

[TJOI2015]弦论 感觉啥都不会就来补自己的弱项了…… \(\text{Solution:}\) 第 \(k\) 小的子串,这东西长得很平衡树。 回忆一下,我们在平衡树上找第 \(k\) 大的做法:记录左右孩子的 \(siz,\) 与 \(k\) 比较大小,不断二分。 那么,同样地,在这题里面,考虑如何类似地在 SAM 上面做这件事情。

[TJOI2015]弦论

题目         点这里看题目。 分析         补习知识:         既然可以求出原串中不同的子串的个数,那么我们同样可以求出含重复子串的个数,同样是\(dp\):         \(g(u)\):从\(u\)节点出发含重复的子串的数量。         转移: \[g(u)=|end-p

[TJOI2015]弦论

一、题目 点此看题 二、解法 考虑后缀自动机,我们先把图建出来,然后算两个东西,第一个是每个节点所代表的串的出现次数valvalval,第二个是经过该点向所有chchch方向走得到的valvalval和,我们可以把所有节点按长度桶排,因为总是长度大的连向长度小的,扫一遍即可处理出这两个值,当t=0t

[TJOI2015]弦论 - 后缀自动机

下了狠心开始做SAM的题目了…… (中间因为傻逼26分写错被卡,进来的时候记得把自己的 cnt 减掉) // TJOI2015 XIAN LUN #include <bits/stdc++.h> using namespace std; const int Maxn = 2000005; struct Suffix_Automata { int maxlen[Maxn], trans[Maxn][26], link[Maxn], Siz

P3975 [TJOI2015]弦论

题目描述 为了提高智商,ZJY开始学习弦论。这一天,她在《 String theory》中看到了这样一道问题:对于一个给定的长度为n的字符串,求出它的第k小子串是什么。你能帮帮她吗? 输入格式 第一行是一个仅由小写英文字母构成的字符串s 第二行为两个整数t和k,t为0则表示不同位置的相同子串

P3975 [TJOI2015]弦论

题意 第一问有一个经典做法:学习笔记 对于第二问,其实就是对于一个状态的所有串,第一问看成一个,第二问看成多个。 code: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5*1e5+10; int n,type,m,tot,last,cnt; int head[maxn<<1],in[maxn<<1],s

P3975 [TJOI2015]弦论

P3975 [TJOI2015]弦论 在原串所有子串中求字典序第k大的子串 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e6+5; 4 char s[maxn]; 5 int a[maxn], c[maxn], size[maxn], sum[maxn], k, t; 6 struct SuffixAutoMaton { 7 int last, cnt; 8 i

BZOJ 3998: [TJOI2015]弦论 SAM

title BZOJ 3998 LUOGU 3975 Description 对于一个给定的长度为 \(n\) 的字符串,求出它的第 \(k\) 小子串是什么。 analysis 建出 \(SAM\) 求 \(K\) 大。 \(T=0\) 除了根以外的状态都代表 \(1\) 个串; \(T=1\) 每个状态 \(fail\) 子树结束结点个数即为串的个数。 code #include<bi

luogu P3975 [TJOI2015]弦论 SAM

luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam。 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串。 然后就可以在sam的贪心的走了。 代码 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define ROF(i,a,b) f

TJOI 2015 弦论

子串,容易想到 \(SAM\) 首先类似模板题一样的记录 \(num(v)\) 表示有多少子串经过 \(v\) \(sum(v)\) 表示状态 \(v\) 在字符串中的出现次数 如果 \(T = 1\) 显然 \(sum(v)=1\) 否则,发现 \(sum(v)\) 实际就是其后继节点的 \(\sum_{}num(y)\) 然后 \(O(n)\) 即可扫除答案 #include <ma

bzoj 3998: [TJOI2015]弦论【SA+二分||SAM】

SA的话t==0直接预处理出每个后缀的不同串贡献二分即可,然后t==1就按字典序枚举后缀,然后跳右端点计算和当前后缀的前缀相同的子串个数,直到第k个 不过bzoj上会T #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=10000005; int n,o,sa[N],rk[

Luogu P3975 [TJOI2015]弦论

题目链接 \(Click\) \(Here\) 题目大意: 重复子串不算的第\(k\)大子串 重复子串计入的第\(k\)大子串 写法:后缀自动机。 和\(OI\) \(Wiki\)上介绍的写法不太一样,因为要同时解决两个问题。 把字符串每个前缀所在等价类的\(siz\)记为\(1\),然后在\(parent\) \(tree\)上跑一次统计,就可

bzoj 3998: [TJOI2015]弦论

可重复与不可重复的第k小串 /************************************************************** Problem: 3998 User: lxy8584099 Language: C++ Result: Accepted Time:5868 ms Memory:126324 kb************************************************************

[bzoj3998][TJOI2015]弦论——后缀自动机

题目大意: 给定一个字符串,求它的第k小子串。 思路: 后缀自动机的模板题。 考虑将后缀自动机建出来之后,求出每一个状态在原串中出现了多少次,然后统计以每个节点往后拓展的字符串总共有多少种(按照拓扑序累加即可),最后直接在DAG上做类似二分的就好了。 /*===============================