后缀数组

四则运算结对编程(JAVA)

早过忘川 提交于 2019-12-01 14:13:03
一、Github项目地址 https://github.com/lyjkekeke/Arithmetic 项目成员:刘昱君,潘蓓文 二、PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 · Estimate · 估计这个任务需要多少时间 30 30 Development 开发 2340 2565 · Analysis · 需求分析 (包括学习新技术) 210 180 · Design Spec · 生成设计文档 90 120 · Design Review · 设计复审 (和同事审核设计文档) 60 30 · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 60 45 · Design · 具体设计 500 400 · Coding · 具体编码 1000 1200 · Code Review · 代码复审 120 90 · Test · 测试(自我测试,修改代码,提交修改) 300 500 Reporting 报告 275 240 · Test Report · 测试报告 240 200 · Size Measurement · 计算工作量 15 15 · Postmortem & Process Improvement Plan ·

结对编程(JAVA实现)

只谈情不闲聊 提交于 2019-12-01 13:58:15
结对成员:钟苑莉 张冰微 一、 Github项目地址: https://github.com/Clarazhangbw/ruangongjd 二、PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 · Estimate · 估计这个任务需要多少时间 30 30 Development 开发 1960 2270 · Analysis · 需求分析 (包括学习新技术) 120 150 · Design Spec · 生成设计文档 40 50 · Design Review · 设计复审 (和同事审核设计文档) 20 30 · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30 · Design · 具体设计 60 80 · Coding · 具体编码 1600 1800 · Code Review · 代码复审 30 40 · Test · 测试(自我测试,修改代码,提交修改) 60 90 Reporting 报告 80 110 · Test Report · 测试报告 30 50 · Size Measurement · 计算工作量 20 20 · Postmortem & Process Improvement Plan · 事后总结

后缀数组

强颜欢笑 提交于 2019-12-01 10:19:25
l uogu回文串 题意给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两个子串中有一个位置不同。 首先我们知道可以用马拉车算法算出该字符串然后再用height来求出答案 但是如果暴力的话,肯定不行,所以我们运用马拉车的一个性质 for(int i=1;i<len;++i) { if(mx>i) p[i]=min(p[id*2-i],mx-i); else p[i]=1; while(ms[i+p[i]]==ms[i-p[i]]) { ++p[i]; if(i+p[i]>mx) { //只有在这里突破了mx的子串才是之前没有出现过的回文子串. //算入分隔符#的限制的话. calc(i-p[i]+1,i+p[i]-1); } } if(p[i]+i>mx) { mx=i+p[i],id=i; } }    实测发现,Manacher算法的此类拓展不一定提交本质不同的回文子串(不算#),因为会有#的限制, 但是结合Manacher算法对称性(关于id对称)的原理可以发现,不在此类拓展中提交(calc)的子串一定在之前提到过. 而Manacher总复杂度O(n),所以是完全能够接受的. 然后问题就换成了如何统计一个回文子串(也就是一个子串)的出现次数. 这里使用后缀数组解决. 一个子串是某一个后缀的前缀,因而

acwing 140. 后缀数组

十年热恋 提交于 2019-12-01 02:45:15
题面: 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围。 在本题中,我们希望使用快排、Hash与二分实现一个简单的 O ( n l o g 2 n ) O(nlog2n)的后缀数组求法。 详细地说,给定一个长度为 n 的字符串S(下标 0~n-1),我们可以用整数 k( 0 ≤ k < n 0≤k<n) 表示字符串S的后缀 S(k~n-1)。 把字符串S的所有后缀按照字典序排列,排名为 i 的后缀记为 SA[i]。 额外地,我们考虑排名为 i 的后缀与排名为 i-1 的后缀,把二者的最长公共前缀的长度记为 Height[i]。 我们的任务就是求出SA与Height这两个数组。 输入格式 输入一个字符串,其长度不超过30万。 输出格式 第一行为数组SA,相邻两个整数用1个空格隔开。 第二行为数组Height,相邻两个整数用1个空格隔开,我们规定Height[1]=0。 输入样例: ponoiiipoi 输出样例: 9 4 5 6 2 8 3 1 7 0 0 1 2 1 0 0 2 1 0 2题解:二分得出两个开头后缀的最长前缀,然后根据不同的写个排序函数排序, #include<iostream> #include<algorithm> #include<cstring> #define ull unsigned long long

Match & Catch CodeForces - 427D 后缀自动机水题

。_饼干妹妹 提交于 2019-11-30 06:17:32
题意: 给出两个字符串a,b,求一个字符串,这个字符串是a和b的子串, 且只在a,b中出现一次,要求输出这个字符串的最小长度。 题解: 将a串放入后缀自动机中,然后记录一下每个节点对应的子串出现的次数 然后把b串取自动机中匹配 然后判断一下 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 #include <unordered_map> 14 15 #define pi acos(-1.0) 16 #define eps 1e-9 17 #define fi first 18 #define se second 19 #define rtl rt<<1 20 #define rtr rt<<1|1 21 #define bug printf("******\n") 22 #define mem(a, b) memset(a,b,sizeof(a)) 23

比较全的字符串算法汇总

断了今生、忘了曾经 提交于 2019-11-30 02:13:43
目录 KMP AC自动机 AC自动机_引入 AC自动机的构建 AC自动机查找 模板代码 注意事项 例题选讲 另一种写法 hash&&trie&&manacher SA后缀数组 1、后缀数组作用 2、后缀数组的构造 3、 SA算法的用途 4、例题:poj 3261 : Milk Patterns 后缀树 (suffix-tree) 后缀自动机(SAM) 大坑填完了! KMP 做题需要脑筋急转弯 板子 for(int i=2;i<=n;i++){ int j=next[i-1]; for(;j&&s[j+1]!=s[i]) j=next[j]; if(s[j+1]==s[i]) next[i]=j+1; else next[i]=0; } 匹配: int i=0,j=0; while(i<=len1){ if(j==0||s1[i+1]==s2[j+1]){ i++,j++; }else j=next[j]; if(j==len2){ printf("%d\n",i-len2+1); j=next[j]; } } AC自动机 AC自动机_引入 对于k个模式串,我们要匹配一个文本串。 如果采用建立k个next数组的方法( kmp ),时间复杂度显然为O((m i +n)*k),不可接受。 那我们就需要一种更简便的数据结构(误),来实现在可控时间范围内(O(n))内的匹配。 除此之外

后缀排序学习笔记

﹥>﹥吖頭↗ 提交于 2019-11-30 01:38:15
建议参考: 后缀数组——处理字符串的有力工具 后缀排序即对一个字符串的每一个后缀进行排序,如果暴力进行排序,考虑到字符串比较的复杂度,效率至少是 O ( n 2 ) O ( n 2 ) //--> 级别的. 考虑依次对每个位置开始的 2 i 2 i //--> 个字符进行分组,把他们看成一个字符串,从小到大枚举 i i //--> 进行处理, s j , j + 2 i − 1 s j , j + 2 i − 1 //--> 的排名即 ( s j , j + 2 i − 1 − 1 + s j + 2 i − 1 , j + 2 i − 1 ) ( s j , j + 2 i − 1 − 1 + s j + 2 i − 1 , j + 2 i − 1 ) //--> 的排名,使用基数排序即可做到 O ( n l o g 2 n ) O ( n l o g 2 n ) //--> 的复杂度. s a [ i ] s a [ i ] //--> 表示第 i i //--> 大的后缀的位置 bool cmp( LL *x, LL a, LL b, LL l) { return x[a]==x[b] && x[a+l]==x[b+l]; } void px() { LL i,j,p,*x= X ,*y= Y ; fo(i, 0 ,n- 1 ) buc[x[i]=s[i]]++; fo(i,

后缀数组学习

好久不见. 提交于 2019-11-29 12:34:51
基础(据说):基数排序:https://blog.csdn.net/zhen921/article/details/80354096 模板题:https://www.luogu.org/problem/P3809 学习粗:https://www.cnblogs.com/chenxiaoran666/p/SuffixSort.html #include<bits/stdc++.h> using namespace std; const int N=1e6+6; int n,SA[N+5],rk[N+5],pos[N+5],tot[N+5]; inline void RadixSort(int S)//基数排序,S表示字符集大小 { int i; for(i=0;i<=S;++i) tot[i]=0;//清空数组 for(i=1;i<=n;++i) ++tot[rk[i]];//从1到n枚举,将tot[rk[i]]加1 for(i=1;i<=S;++i) tot[i]+=tot[i-1];//累加 for(i=n;i;--i) SA[tot[rk[pos[i]]]--]=pos[i];//倒序枚举,更新SA数组 } inline void Solve(char *s) { int i,k,cnt=0,Size=122;//初始化字符集大小为122(即'z'的ASCII码) for(n

UVA - 11107 Life Forms (广义后缀自动机+后缀树/后缀数组+尺取)

落花浮王杯 提交于 2019-11-29 10:24:50
题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出。 这道题算是我的一个黑历史了吧,以前我的做法是对这n个字符串建广义后缀自动机,然后在自动机上dfs,交上去AC了,然而事后发现算法假了,出了个数据把自己给hack了... 之前写的太烂了,决定重写一遍。 正确的操作是对n个串倒序建广义后缀自动机,建好以后把每个串放到自动机上跑一遍,把所有覆盖到的状态结点打上标记(每个串只标记一次,用vis判重),记录每个状态在多少个串中出现过,然后在后缀树(fail树)上按字典序dfs一遍就好了。 注意每添加一个字符串,需要把last指向根节点,而且在每次往后添加结点的时候判断当前结点是否存在过,如果存在则需要特殊处理(源自洛谷zcysky大神的思路) 复杂度$O(n\sqrt n)$,但上界很松,跑起来速度还是很快滴~ 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=2e5+10,M=26; 5 int n,ka; 6 char s[105][1010]; 7 struct SAM { 8 int fa[N],go[N][M],mxl[N],last,tot,ch[N][M],pos[N],cc[N],nc,vis[N],cnt[N]

8.29题解

梦想的初衷 提交于 2019-11-29 07:57:01
T1 考试打表两小时,终于找出了正解的规律,结果zz低错,直接挂掉70分。。。。。。 其实说实话打表找规律很好用,最开始我是发现对于一个质数$x$,$x^k$的约数和就是$x$的约数和+$\sum\limits_{i=2}^{k}{x^i}$,当然我考试的时候zz,这实际上就是$\sum\limits_{i=0}^{k}{x^i}$,这个可以直接等比数列求和,继续找规律,我们可以发现约数和是个积性函数,设$x$的约数和为$f(x)$,$x=p_1^{c_1}{\times}p_2^{c_2}{\times}{\cdots}{\times}p_n^{c_n}$,那么$f(x)=f(p_1^{c_1}){\times}f(p_2^{c_2}){\times}{\cdots}{\times}f(p_n^{c_n})$,然后分解质因数,直接累计答案就可以了 细数我的zz操作 1.在${\%}$意义下,想要除一个数,就直接除了,忘记需要乘逆元了 2.直接把两个超大质因数乘起来了,忘记了我有一个大于${\sqrt{n}}$的质因数了,没取模,直接炸了 3.这个很让人无语,由于我没有发现质数的约数和,和后面拼起来是完整的等比数列,于是我的等比数列求和最小的时候是$b-1$项,他的数据里恰好有$b=0$的情况,然后我的快速幂就死了 1 #include<iostream> 2 #include