http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 100003; int t1[N], t2[N], c[N]; void st(int *x, int *y, int *sa, int n, int…
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 11 到 nn. 除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度. 输入格式 一行一个长度为 nn 的仅包含小写英文字母的字符串. 输出格式 第一行 n 个整数,第 i个整数表示排名为 i 的后…
35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 11 到 nn. 除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度. 输入格式 一行一个长度为 nn 的仅包含小写英文字母的字符串. 输出格式 第一行 nn 个整数,第 ii 个整数表示排名为 ii…
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const int N=1e6+5; int n,tm[N],t1[N],t2[N],SA[N],rk[N],ht[N]; //SA[i]=j:排名为i的后缀开头的下标为j //rk[i]=j:以下标i开头的后缀排名为j //ht[i]:排名为i的后缀与排名为i-1的后缀的LCP长度 char s[N]; void Get_…
1500 后缀排序 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设字符串是S=S1S2--Sn,定义Ti=SiSi+1--Sn.T1, T2, -, Tn就叫做S的n个后缀. 关于字符串大小的比较定义如下(比较规则和PASCAL中的定义完全相同,熟悉PASCA…
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; ; ; int sa[maxn+pl]={};//排名第i…
题目链接 论找到一个好的教程的正确性.. 后缀数组 下标从1编号: //299ms 2560kb #include <cstdio> #include <cstring> #include <algorithm> const int N=1e5+5; int n,sa[N],rk[N],sa2[N],tm[N],ht[N]; char s[N]; void Get_SA() { int *x=rk,*y=sa2,m=200; for(int i=0; i<=m;…
后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> using namespace std; ]; ][],U[],T…
ref and 挑战程序设计竞赛. 主要是发现自己以前写得代码太难看而且忘光了,而且我字符串死活学不会啊,kmp这种东西我都觉得是省选+难度啊QAQ #include <iostream> #include <cstring> #include <cstdio> using namespace std; int n, cnt[1000005], rnk[1000005], saa[1000005], tmp[1000005], m=128, p; char ss[100…
1.题目大意:后缀数组模板题 2.分析:汝佳的书上的代码的有bug,还有那个n是字符串长度+1,''也要加入排序的 存个模板QAQ #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; char s[101000]; int sa[101000], t[101000], t2[101000], c[101000]; i…
P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 11 到 nn. 输入输出格式 输入格式: 一行一个长度为 nn 的仅包含大小写英文字母或数字的字符串. 输出格式: 一行,共n个整数,表示答案. 输入输出样例 输入…
题目链接 今天终于学会了后缀数组模板qwq 不过只会模板emmmm 首先我们有一本蓝书emmmmmm 然后看到蓝书221页代码之后我就看不懂了 于是请出rqy rqy: 一开始那是个对单个字符排序的操作啊 c[i]表示值为i的字符有多少个 x[i]表示第i个位置的优先级是多少 sa[i]表示优先级是i的字符位置 然后第一行明显是初始化,第二行明显就是统计字符个数 至于第三行为什么要求前缀和呢 我们思考优先级越小的排的越靠前 所以说,设优先级是0的有c[0]个,优先级是1的有c[1]个,以此类推…
[模板]后缀排序 题目背景 这是一道模板题. 题目描述 读入一个长度为 \(n\) 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 \(1\) 到 \(n\) . 输入输出格式 输入格式: 一行一个长度为 \(n\) 的仅包含大小写英文字母或数字的字符串. 输出格式: 一行,共 \(n\) 个整数,表示答案. 输入输出样例 输入样例#1: 复制 ababa 输出样例#1: 复制 5 3 1 4 2…
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度. 输入格式 一行一个长度为 n 的仅包含小写英文字母的字符串. 输出格式 第一行 n 个整数,第 i 个整数表示排名为 i 的后缀的第一个字符在原串中的位置. 第二行 n−1 个整数,第 i…
借用罗大神的模板,开始搞后缀数组 #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; #define N 222222 /****后缀数组模版****/ #define F(x)((x)/3+((x)%3==1?0:tb)) //F(x)求出原字符串的suffix(x)在新的字符串中的起始位置 #define G(…
P3809 [模板]后缀排序 从这学的 后缀数组sa[i]就表示排名为i的后缀的起始位置 x[i]是第i个元素的第一关键字 y[i]表示第二关键字排名为i的数,在第一关键字中的位置 #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 1000005 #define rint register int int n,m,c[N],sa[N],x[N],y[N…
传送门 后缀排序模板题. 终于会后缀数组了(然而只会倍增并不会DC3DC3DC3). 在这里列举几个数组的意思: sai:sa_i:sai​:当前排名第iii的后缀的起始下标. rkirk_irki​当前下标为iii的后缀对应的排名. sa2isa2_isa2i​当前排名为iii的第二关键字对应的下标. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=1e6+5; int…
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> #define space putchar(' ') #define enter putchar('\n') using namespace std; typedef long l…
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛>.时间复杂度\(\mathcal O(n\log^2n)\). 源代码: #include<cstdio> #include<cstring> #include<algorithm> const int N=1e6+1; char s[N]; int n,k,sa[N…
题意 题目背景 这是一道模板题. 题目描述 读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 $ 1 $ 到 $ n $. 输入输出格式 输入格式: 一行一个长度为 $ n $ 的仅包含大小写英文字母或数字的字符串. 输出格式: 一行,共n个整数,表示答案. 输入输出样例 输入样例#1: 复制 ababa 输出样例#1: 复制 5 3 1 4 2 说明 $n <= 10^6…
题意 给定字符串A.B,求其最长公共子串 后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A.B,统计答案即可. #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <iostream> using namespace std; ; char st…
//后缀数组模板,MANX为数组的大小 //支持的操作有计算后缀数组(sa数组), 计算相邻两元素的最长公共前缀(height数组),使用get_height(); //计算两个后缀a, 和b的最长公共前缀,请先使用lcp_init(),再调用get_lcp(a, b)得到 //下面的n是输入字符串的长度+1(n = strlen(s) + 1), m是模板的范围 m=128表示在字母,数字范围内,可以扩大也可缩小 //s[len] 是插入的一个比输入字符都要小的字符 struct SufArr…
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞出后缀数组; 然后顺序枚举i; 对于sa[i]< n的输出对应的s[sa[i]+n-1]就好了 后缀的含义是把后缀按照字典序从小到大排一下. 按照这个规则; 就能搞了; 必然是在前n个字符中就能比较出来; 所以及时后缀多了一些也没事. [完整代码] #include <bits/stdc++.h&…
题目链接:http://uoj.ac/problem/35 这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度. 输入格式 一行一个长度为 n 的仅包含小写英文字母的字符串. 输出格式 第一行 n 个整数,第 i 个整数表示排名为 i 的后缀…
题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设字符串是S=S1S2……Sn,定义Ti=SiSi+1……Sn.T1, T2, …, Tn就叫做S的n个后缀. 关于字符串大小的比较定义如下(比较规则和PASCAL中的定义完全相同,熟悉PASCAL的同学可以跳过此段): 若A是B的前缀,则A<B:否则令p满足:A1A2…Ap-1=B1B2…Bp-1,…
后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 下面是一些note: 定义 对于字符串\(s\)的子串\(t\), \(endpos(t)\) (或者 \(right(t)\) ) 表示t在s中出现位置的右端点的集合. \(endpos\)互不相交. 有相同 \(endpos\) 集合的字符串构成一个等价类. 对于每个等价类, 包含的字符串长度为…
后缀树: 字符串匹配算法一般都分为两个步骤,一预处理,二匹配. KMP和AC自动机都是对模式串进行预处理,后缀树和后缀数组则是对文本串进行预处理. 后缀树的性质: 存储所有 n(n-1)/2 个后缀需要 O(n) 的空间,n 为的文本(Text)的长度: 构建后缀树需要 O(dn) 的时间,d 为字符集的长度(alphabet): 对模式(Pattern)的查询需要 O(dm) 时间,m 为 Pattern 的长度: 介绍后缀树之前,我们首先要知道压缩字典树的概念. 我们在对关键字建立字典树的时…
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了.当然一般的字符串问题中,我们只要用简单的暴力算法就可以解决了,然后如果暴力效率太低,就用个hash.当然hash也是一个面试中经常被用到的方法.这样看来,这样的一些算法和数据结构实际上很少会被问到,不过如果使用它们一般可以得…
裸的统计不同的重复出现子串(不重叠)种数的题.多次使用后缀排序要注意小细节.y数组在重复使用时一定要清空,看那个line25 +k就明白了 ,cnt也要清空,为什么就不说了 #include<bits/stdc++.h> using namespace std; typedef long long ll; template<typename T>inline ):;} template<typename T>inline ):;} +; char s[N]; int n…