| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
无限RE!!求dalao来看看小弟的代码Orz#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 500050
using namespace std;
int n, s[MAXN], t1[MAXN], t2[MAXN], c[1000], sa[MAXN], height[MAXN], rank[MAXN];
void buildsa(){
n++;
int m = 600;
int *x = t1, *y = t2;
memset(c, 0, sizeof(c));
for (int i = 0; i < n; i++) c[x[i] = s[i]]++;
for (int i = 1; i < m; i++) c[i] += c[i - 1];
for (int i = n - 1; i >= 0; i--) sa[--c[x[i]]] = i;
for (int k = 1; k <= n; k <<= 1){
int p = 0;
for (int i = n - k; i < n; i++) y[p++] = i;
for (int i = 0; i < n; i++) if (sa[i] >= k) y[p++] = sa[i] - k;
memset(c, 0, sizeof(c));
for (int i = 0; i < n; i++) c[x[y[i]]]++;
for (int i = 1; i < m; i++) c[i] += c[i - 1];
for (int i = n - 1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
swap(x, y);
p = 1;
x[sa[0]] = 0;
for (int i = 1; i < n; i++) x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? p - 1: p++;
// for (int i = 0; i < n; i++) cout << y << ' ';
// memcpy(rank, y, sizeof(y));
if (p >= n) break;
m = p;
}
}
void getheight(){
// cout << n << endl;
for (int i = 0; i < n; i++) rank[sa[i]] = i;
int h = 0;
// height[0] = 0;
for (int i = 0; i < n; i++){
int j = sa[rank[i] - 1];
if (h) h--;
while(s[i + h] == s[j + h]) h++;
height[rank[i]] = h;
}
}
bool findx(int k){
int minn, maxn;
minn = maxn = sa[0];
for (int i = 0; i < n; i++){
if (height[i] < k){
minn = maxn = sa[i];
continue;
}
maxn = max(maxn, sa[i]);
minn = min(minn, sa[i]);
if (maxn - minn > k) return 1;
}
return 0;
}
int main(){
// freopen("c.in", "r", stdin);
// freopen("c.out", "w", stdout);
while(~scanf("%d", &n)){
if (n == 0) break;
for (int i = 0; i < n; i++) scanf("%d", &s[i]);
if (n < 10){
printf("0\n");
continue;
}
n--;
for (int i = 0; i < n; i++) s[i] = s[i + 1] - s[i] + 300;
s[n] = 0;
// cout << n << endl;
buildsa();
getheight();
// for (int i = 0; i < n; i++) cout << sa[i] << ' ';
int l = 0, r = n;
while(l < r){
int mid = (l + r + 1) >> 1;
if (findx(mid)) l = mid;
else r = mid - 1;
// cout << "(" << l << ", " << r << ")";
}
printf("%d\n", l < 4? 0: l + 1);
}
}
RT 随机生成了100+M超范围的数据 就是没一个RE。。 一上POJ就RE了 求解Orz
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator