寻找最长的重复序列,枚举两个序列的开头的序列的长度
采用了一个力度很大的优化:
每次枚举末端那一位时都从开始的一位加上当前最大长度开始枚举,前一个序列开头只用枚举到(N-当前的最大长度)即可。
/*
PROB: theme
LANG: C++
ID: xsy97051
*/
#include <cstdio>
#include <iostream>
using namespace std;
int v[5050],ans=0,n;
int main()
{
freopen("theme.in","r",stdin);
freopen("theme.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
for(int i=5;i<=n;i++)
{
int len=0,dis=100;
for(int j=1;j+i<=n;j++)
{
if(v[j]-v[j+i]==dis)
{
if(len==i) break;
len++;
if(len>=5) ans=max(ans,len);
}
else
{
len=1;
dis=v[j]-v[i+j];
}
}
}
cout<<ans<<endl;
return 0;
}