| ||||||||||
| 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?我将数组同时加上一个数,然后插入到后面,再求后缀数组,结果为什么是PE#include <iostream>
using namespace std;
const int nMax = 40100;
const int mMax = 200;
int sa[nMax], rank[nMax], height[nMax];
int wx[nMax], wy[nMax];
int _ws[mMax], wv[nMax];
int N;
int A[nMax];
int cmp(int *t, int a, int b, int l)
{
if(t[a] == t[b] && t[a + l] == t[b + l]) return 1;
return 0;
}
void da(int *t, int n, int m)
{
int *x = wx, *y = wy, *temp;
int i, j, p;
for(i = 0; i < m; ++ i) _ws[i] = 0;
for(i = 0; i < n; ++ i) _ws[x[i] = t[i]] ++;
for(i = 1; i < m; ++ i) _ws[i] += _ws[i - 1];
for(i = n - 1; i >= 0; -- i) sa[-- _ws[x[i]]] = i;
for(j = 1, p = 1; p != n; j = 2 * j, m = p)//p
{
for(i = n - j, p = 0; i < n; ++ i) y[p ++] = i;
for(i = 0; i < n; ++ i)//i
if(sa[i] >= j)
y[p ++] = sa[i] - j;
for(i = 0; i < m; ++ i) _ws[i] = 0;
for(i = 0; i < n; ++ i) wv[i] = x[y[i]];
for(i = 0; i < n; ++ i) _ws[wv[i]] ++;
for(i = 1; i < m; ++ i) _ws[i] += _ws[i - 1];
for(i = n - 1; i >= 0; -- i) sa[-- _ws[wv[i]]] = y[i];
for(temp = x, x = y, y = temp, i = 1, p = 1, x[sa[0]] = 0;i < n;i ++)
x[sa[i]] = cmp(y, sa[i], sa[i - 1], j) ? p - 1 : p ++;
}
}
void calHeight(int n)
{
int i, j, k = 0;//k
for(i = 1; i <= n; ++ i) rank[sa[i]] = i;
for(i = 0; i < n; height[rank[i]] = k, i ++)
for(k ? k -- : 0, j = sa[rank[i] - 1]; A[j + k] == A[i + k]; k ++);//
}
int bsearch(int n)
{
int l, r;
l = 0; r = N;
while(l + 1 < r)
{
int flag = 0;
int i;
int max = 0, min = nMax;
int mid = (l + r) / 2;
for(i = 2; i <= n; ++ i)//height[1]始终为0
{
if(height[i] < mid)
{
if(max - min >= mid)
{
flag = 1;
break;
}
max = 0;
min = nMax;
}
else
{
int a = sa[i],
b = sa[i - 1];
if(a > N) a -= 1 + N;
if(b > N) b -= 1 + N;
if(a > max) max = a;
if(b > max) max = b;
if(a < min) min = a;
if(b < min) min = b;
}
}
if(max - min >= mid)
flag = 1;
if(flag) l = mid;
else r = mid;
}
return l;
}
int main()
{
//freopen("e://data.in", "r", stdin);
while(scanf("%d", &N) != EOF && N)
{
int i, k;
int ans = 0;
for(i = 0; i < N; ++ i)
scanf("%d", &A[i]);
A[N] = 180;
for(k = 1; k < 88; k ++)
{
for(i = 0; i < N; ++ i)
A[N + 1 + i] = A[i] + k;
A[2 * N + 1] = 0;
da(A, 2 * N + 2, 182);
calHeight(2 * N + 1);
int res = bsearch(2 * N + 1);
if(res > ans)
ans = res;
}
if(ans >= 5)
printf("%d\n", ans);
else
printf("0\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator