poj1743(后缀数组)
http://poj.org/problem?id=1743 题意:给出一串字符,求不重合的最长重复子串.......... 我自己的一点想法:编完后发现,其实就是将height值分组,然后记录在二分答案时满足height值>=p的sa[i]的最大最小值,然后要是最大值减去最小值会>=p,这就说明两个子串的lcp值>=p并且它们的坐标也相差>=p,就自然满足题意......... #include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define maxx 20010 int wsf[maxx],wa[maxx],wv[maxx],wb[maxx],s[maxx]; int height[maxx],rank[maxx],sa[maxx]; int cmp(int *r,int a,int b,int k) { return r[a]==r[b]&&r[a+k]==r[b+k]; } void getsa(int *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) wsf[i]=0; for(i=0;i<n;i++) wsf[x[i]=r[i]]++; for(i=1;i<m;i++) wsf[i