后缀数组水题(待完善)

来源:互联网 发布: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
原创粉丝点击