记录编号 |
380812 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
乐曲主题 |
最终得分 |
100 |
用户昵称 |
可以的. |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.024 s |
提交时间 |
2017-03-10 11:35:45 |
内存使用 |
0.89 MiB |
显示代码纯文本
#include <stdio.h>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <cstdlib>
#include <iostream>
#include <bitset>
#include <cmath>
#include <vector>
#define Mem(a, b) memset(a, b, sizeof a)
#define Mcpy(a, b) memcpy(a, b, sizeof a)
#define RG register
#define IL inline
using namespace std;
typedef long long LL;
typedef unsigned int uint;
typedef unsigned long long ull;
IL void qkin(RG int &res){
RG int x,f=1; RG char ch;
while(ch=getchar(),ch<'0'||ch>'9')if(ch=='-')f=-1;x=ch-48;
while(ch=getchar(),ch>='0'&&ch<='9')x=x*10+ch-48;res=x*f;}
IL void read(RG int &A){ qkin(A); }
IL void read(RG int &A,RG int &B){ qkin(A),qkin(B); }
IL void read(RG int &A,RG int &B,RG int &C){ qkin(A),qkin(B),qkin(C); }
#define Gets(s) scanf("%s", s+1);
const double INF = 1e60;
const int inf = 0x7f7f7f7f;
const double Pi = acos(-1);
const double eps = 1e-8;
const int maxn = 5010*2;
int n,w[maxn],cf[maxn],rt,last,cnt;
struct SAM
{
int root,val;
map<int, int> next;
}a[maxn];
void add(int c){
int p = last, np = ++cnt;
a[np].val = a[p].val + 1;
while(p && !a[p].next[c]){
a[p].next[c] = np;
p = a[p].root;
}
if(!p) a[np].root = rt;
else {
int q = a[p].next[c];
if(a[q].val == a[p].val+1) a[np].root = q;
else {
int nq = ++cnt;
a[nq] = a[q];
a[nq].val = a[p].val+1;
a[np].root = a[q].root = nq;
while(p && a[p].next[c] == q){
a[p].next[c] = nq;
p = a[p].root;
}
}
}
last = np;
}
int bkt[maxn],d[maxn];
int size[maxn];
int L[maxn],R[maxn];
int main(){
#define HAHA LALA
#ifdef HAHA
freopen("theme.in", "r", stdin);
freopen("theme.out", "w", stdout);
#endif
rt = last = ++cnt;
read(n); for(int i=1; i<=n; i++) read(w[i]);
for(int i=1; i<n; i++) {
cf[i] = w[i+1] - w[i];
add(cf[i]);
}
int p = rt;
Mem(L, 63); Mem(R, 0);
for(int i=1; i<n; i++) {
size[p = a[p].next[cf[i]]] = 1;
L[p] = R[p] = i;
}
for(int i=1; i<=cnt; i++) bkt[a[i].val]++;
for(int i=1; i<=cnt; i++) bkt[i] += bkt[i-1];
for(int i=cnt; i>=1; i--) d[bkt[a[i].val]--] = i;
for(int i=cnt; i>=1; i--){
int x = d[i], fa = a[x].root;
L[fa] = min(L[fa], L[x]);
R[fa] = max(R[fa], R[x]);
size[fa] += size[x];
}
int ans = 0;
for(int i=1; i<=cnt; i++){
if(size[i] >= 2){
ans = max(ans, min(R[i]-L[i], a[i].val+1));
}
}
ans = ans>=5?ans:0;
printf("%d\n", ans);
return 0;
}