后缀数组水题(待完善)
来源:互联网 发布:ichart.js下载 编辑:程序博客网 时间:2024/06/06 18:36
//poj 2774#include<iostream>#include<stdio.h>#include<string.h>using namespace std;#define min(x,y) x>y? y:x#define maxn 200010#define rep(i,n) for(int i = 0;i < n; i++)char str[maxn],str1[maxn];//接口:w用来存字符串,len表示的是字符串的长度,up表示是从0到多少-1,固至少要开大一位的int rk[maxn],sa[maxn],height[maxn],w[maxn],wa[maxn],res[maxn];void getSa (int len,int up) {int *k = rk,*id = height,*r = res, *cnt = wa;rep(i,up) cnt[i] = 0;rep(i,len) cnt[k[i] = w[i]]++;rep(i,up) cnt[i+1] += cnt[i];for(int i = len - 1; i >= 0; i--) {sa[--cnt[k[i]]] = i;}int d = 1,p = 0;while(p < len){for(int i = len - d; i < len; i++) id[p++] = i;rep(i,len)if(sa[i] >= d) id[p++] = sa[i] - d;rep(i,len) r[i] = k[id[i]];rep(i,up) cnt[i] = 0;rep(i,len) cnt[r[i]]++;rep(i,up) cnt[i+1] += cnt[i];for(int i = len - 1; i >= 0; i--) {sa[--cnt[r[i]]] = id[i];}swap(k,r);p = 0;k[sa[0]] = p++;rep(i,len-1) {if(sa[i]+d < len && sa[i+1]+d <len &&r[sa[i]] == r[sa[i+1]]&& r[sa[i]+d] == r[sa[i+1]+d])k[sa[i+1]] = p - 1;else k[sa[i+1]] = p++;}if(p >= len) return ;d *= 2,up = p, p = 0;}}void getHeight(int len) {rep(i,len) rk[sa[i]] = i;height[0] = 0;for(int i = 0,p = 0; i < len - 1; i++) {int j = sa[rk[i]-1];while(i+p < len&& j+p < len&& w[i+p] == w[j+p]) {p++;}height[rk[i]] = p;p = max(0,p - 1);}}int main(){ // freopen("in.txt","r",stdin); while(scanf("%s%s",str,str1) != EOF) { int len = strlen(str); int n = 0; for(int i = 0; i < len; i ++) { w[n ++] = str[i] - 'a' + 1; } w[n ++] = 28; len = strlen(str1); for(int i =0;i < len; i ++) { w[n ++] = str1[i] - 'a' + 1; } w[n ++] = 0;//切记这句话 //n++后n才等于len, = 0这一句相当于字符串中的\0,不算它时位置是个数减1的 getSa(n,28); getHeight(n); int ans = 0; len = strlen(str); for(int i = 2; i < n; i ++) { if(sa[i] >= 0 && sa[i] < len && sa[i - 1] > len) { ans = max(ans,height[i]); } if(sa[i - 1] >= 0 && sa[i - 1] < len && sa[i] > len) { ans = max(ans,height[i]); } } printf("%d\n",ans); }}
0 0
- 后缀数组水题(待完善)
- 后缀数组(内容待补)
- 闲杂(待完善)
- EditText(待完善)
- TextView(待完善)
- Button(待完善)
- 布局(待完善)
- C++/C之数组篇(待完善)
- 整形数组,去冗余,待完善中
- 数据结构基础(待完善)
- 进程相关(待完善)
- linux常用命令(待完善)
- Java多线程(待完善)
- 关于Snaphu(待完善)
- okHttp学习(待完善)
- this指针(待完善)
- Android 小结(待完善)
- SQL优化(待完善)
- CGContextSaveGState与CGContextRestoreGState详解
- 自然对数e的来源以及证明
- Android ListView长按弹出CheckBox,实现全选,反选,批量删除功能
- MySQL技术内幕InnoDB存储引擎学习笔记(第九章)
- 2017网易校招内推笔试题
- 后缀数组水题(待完善)
- Android View框架总结(一)
- OJ题:输入一个多位的数字,求各数位相加。
- JWT 学习笔记
- 2,从零开始搭建SSHM开发框架(集成Spring+JPA)
- java基础——bufferedinputstream FileInputStream inputstream的比较
- java mysql 高性能批量处理 设置rewriteBatchedStatements
- 递归介绍
- Mac中的快捷键