标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 22499 | Accepted: 7679 |
Description
Input
Output
Sample Input
30 25 27 30 34 39 45 52 60 69 79 69 60 52 45 39 34 30 26 22 18 82 78 74 70 66 67 64 60 65 80 0
Sample Output
5
Hint
Source
#include<stdio.h> #include<algorithm> #include<string.h> #include<stdlib.h> using namespace std; const int maxn = 1e5+200; const int INF = 0x3f3f3f3f; int a[maxn],s[maxn]; int sa[maxn], t[maxn], t2[maxn], c[maxn]; int rank[maxn], height[maxn]; void build_sa(int n, int m){ int i,*x = t, *y = t2; //初始化,基数排序 for(i = 0; i < m; i++) c[i] = 0; for(i = 0; i < n; i++) c[x[i] = s[i]]++; for(i = 1; i < m; i++) c[i] += c[i-1]; for(i = n-1; i >= 0; i--) sa[--c[x[i]]] = i; for(int k = 1; k <= n; k <<= 1){ int p = 0; for(i = n-k; i < n; i++) y[p++] = i; for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i]-k; for(i = 0; i < m; i++) c[i] = 0; for(i = 0; i < n; i++) c[x[y[i]]]++; for(i = 1; i < m; i++) c[i] += c[i-1]; for(i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i]; swap(x,y); p = 1; x[sa[0]] = 0; for(i =1; i < n; i++) x[sa[i]] = y[sa[i-1]] == y[sa[i]] && y[sa[i-1]+k] ==y[sa[i]+k] ? p-1:p++; if(p >= n) break; m = p; } return ; } void getheight(int n) { int i, j, k = 0; for(i = 0; i < n; i++) { rank[sa[i]] = i; } for(i = 0; i < n; i++) { if(k) k--; int j = sa[rank[i]-1]; while(s[i+k] == s[j+k]){ k++; } height[rank[i]] = k; } } bool check(int mid , int n){ int mi=INF , mx = 0; for(int i=2;i<=n+1;i++){ if(i==n+1 || height[i] < mid){ // printf("%d %d %d\n",i,height[i],mid); mi = min(mi, sa[i-1]); mx = max(mx, sa[i-1]); if(mx - mi >= mid){ return true; } mx = 0;mi = INF; } else if(height[i] >= mid){ mi= min(mi,sa[i-1]); mx= max(mx,sa[i-1]); } } return false; } int main(){ int n; while(scanf("%d",&n)!=EOF && n ){ for(int i=0;i<n;i++){ scanf("%d",&a[i]); } if(n<10){ puts("0"); continue; } for(int i=0;i<n-1;i++){ s[i]=a[i+1]-a[i]+89; } s[n-1]=0; // for(int i=0;i<=n;i++){ // printf("%d ",s[i]); // }puts(""); build_sa(n,200); // for(int i=0;i<=n;i++){ // printf("%d %d-+-+-+\n",i,sa[i]); // } getheight(n); // for(int i=0;i<n;i++){ // printf("%d %d------------------\n",i,height[i]); // } int l=4,r=n/2+1,mid; int ans = 0; while(l<=r){ mid=(l+r)/2; if(check(mid , n)){ l=mid+1; ans=max(mid,ans); }else{ r=mid-1; } } if(ans<4) puts("0"); else printf("%d\n",ans+1); } return 0; } /* 10 1 1 1 1 1 1 1 1 1 1 */
Poj 1743——Musical Theme——————【后缀数组模板题】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4884844.html