DC3求后缀数组板子
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 2e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = ;
const double eps = 1e-;
const double PI = acos(-); #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb))
#define G(x) ((x) < tb ? (x) * 3 + 1 : ((x) - tb) * 3 + 2) int r[ * N], sa[ * N];
int wa[ * N], wb[ * N], wv[ * N], ss[ * N];
int rnk[N], lcp[N]; int c0(int *r, int a, int b) {return r[a] == r[b] && r[a + ] == r[b + ] && r[a + ] == r[b + ]; } int c12(int k, int *r, int a, int b) {
if(k == ) return r[a] < r[b] || r[a] == r[b] && c12(, r, a + , b + );
return r[a] < r[b] || r[a] == r[b] && wv[a + ] < wv[b + ];
} void sort(int *r, int *a, int *b, int n, int m) {
for(int i = ; i < n; i++) wv[i] = r[a[i]];
for(int i = ; i < m; i++) ss[i] = ;
for(int i = ; i < n; i++) ss[wv[i]]++;
for(int i = ; i < m; i++) ss[i] += ss[i - ];
for(int i = n - ; i >= ; i--) b[--ss[wv[i]]] = a[i];
} void DC3(int *r, int *sa, int n, int m) {
int i, j, p;
int *san = sa + n, *rn = r + n;
int ta = , tb = (n + ) / , tbc = ; r[n] = r[n + ] = ;
for(i = ; i < n; i++) if(i % != ) wa[tbc++] = i; sort(r + , wa, wb, tbc, m);
sort(r + , wb, wa, tbc, m);
sort(r, wa, wb, tbc, m); for(p = , rn[F(wb[])] = , i = ; i < tbc; i++)
rn[F(wb[i])] = c0(r, wb[i - ], wb[i]) ? p - : p++; if(p < tbc) DC3(rn, san, tbc, p);
else for(i = ; i < tbc; i++) san[rn[i]] = i; for(i = ; i < tbc; i++) if(san[i] < tb) wb[ta++] = san[i] * ;
if(n % == ) wb[ta++] = n - ; sort(r, wb, wa, ta, m); for(i = ; i < tbc; i++) wv[wb[i] = G(san[i])] = i;
for(i = , j = , p = ; i < ta && j < tbc; p++)
sa[p] = c12(wb[j] % , r, wa[i], wb[j]) ? wa[i++] : wb[j++]; for( ; i < ta; p++) sa[p] = wa[i++];
for( ; j < tbc; p++) sa[p] = wb[j++];
} void calc_LCP(int *r, int *sa, int n) {
int k = ;
for(int i = ; i < n; i++) rnk[sa[i]] = i;
for(int i = ; i < n - ; lcp[rnk[i++]] = k) {
if(k) k--;
for(int j = sa[rnk[i] - ]; r[i + k] == r[j + k]; k++);
}
} int n, m, tot;
char S[N], T[N]; int main() {
scanf("%s%s", S, T);
n = strlen(S); m = strlen(T);
for(int i = ; i < n; i++) r[tot++] = S[i];
r[tot++] = '$';
for(int i = ; i < m; i++) r[tot++] = T[i];
DC3(r, sa, tot + , );
calc_LCP(r, sa, tot + );
return ;
} /*
*/
DC3求后缀数组板子的更多相关文章
- 后缀数组:倍增法和DC3的简单理解
一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n- ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 洛谷P4051 [JSOI2007]字符加密 后缀数组
题目链接:https://www.luogu.org/problemnew/show/P4051 思路:我们联想求后缀数组sa的过程,发现我们在求y数组的时候(第二关键字,下标为第二关键字的排位,值为 ...
- CH1402 后缀数组【Hash】【字符串】【二分】
1402 后缀数组 0x10「基本数据结构」例题 描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围.在本题中,我们希望使用快排.Hash与二分实现 ...
- kuangbin带你飞 后缀数组 题解
2份模板 DC3 . 空间复杂度O3N 时间复杂度On #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb)) #define G(x) ((x) < ...
- 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈
P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...
- POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题
POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 ...
随机推荐
- linux下export命令添加、删除环境变量(转载)
转自:http://blog.csdn.net/shenshendeai/article/details/49794699 export命令 功能说明:设置或显示环境变量. 语 法:export [- ...
- Day7--------------虚拟机网络服务
1.桥接 连接到本地的网卡,把本机的网卡看作是虚拟交换机 ping ip地址 arping -i eth0 192.168.11.11 返回物理MAC地址 #可以检查是否有重复 ...
- 浅谈深度优先和广度优先(scrapy-redis)
首先先谈谈深度优先和广度优先的定义 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的 ...
- MYSQL事务处理失效原因
mysql有多种存储引擎,有些版本(mysql5.5.5以前默认是MyISAM,mysql5.5.5以后默认是InnoDB)安装时默认的存储引擎是MyISAM,而MyISAM存储引擎是不支持事务处理的 ...
- 纯webpack打包项目
webpack 3 零基础入门教程 http://webpackbook.rails365.net/466996(文本) https://www.rails365.net/movies/webpack ...
- Confluence 6 降级你的许可证
如果你决定降级你 Confluence 的许可证而削减你的许可证开支,你需要确定当前已经直排的用户许可证数量(在用户许可证页面中)要少于你希望应用的新的许可证的允许用户数量,在你应用新许可证的时候. ...
- iOS 运行时使用(交换两个方法)
举例 在创建了如下代码 NSString *str=nil; NSURL *url =[NSURL URLWithString:str]; NSLog(@"%@",url); 但是 ...
- LeetCode(101):对称二叉树
Easy! 题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2, ...
- jsp 标签文件
一. tag file 简介 tag file从两个方面简化了自定义标签的开发.首 先,tag file无须提前编译,直到第一次被调用才会编 译.除此之外,仅仅使用JSP语法就可以完成标签的扩 展定义 ...
- C语言将字符串转json
示例代码: #include <stdio.h> #include <string.h> #include <stdlib.h> char *strrpc(char ...