求差,不多说了
一开始的思路是先找到4个相同的串,找出最长串。
果断TLE
然后瞄了解题报告,用二分加速
http://www.mamicode.com/info-detail-252988.html
自己的代码存在许多小问题,修改到崩溃
#include<iostream>
#include<vector>
#include <string>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =20010;
const int key = 177;
int tol,n,m,newn;
unsigned long long hashn[maxnum];
unsigned long long p[maxnum];
//邻接表
unsigned long long tag[maxnum];
int nth[maxnum];
int head[maxnum];
int nextn[maxnum];
int total;
void Clear(){
FOR(i,0,maxnum-1) head[i]=-1;
total=0;
}
int inserthash(unsigned long long lentag,int pos){
int x = lentag%maxnum;
for(int i=head[x];i!=-1;i=nextn[i]){
if(tag[i]==lentag)
return nth[i];
}
nth[total]=pos;
tag[total]=lentag;
nextn[total]=head[x];
head[x]=total++;
return pos;
}
bool check(int len){
Clear();
FOR(i,len,n-1){
if(i-inserthash((unsigned long long)hashn[i]-hashn[i-len]*p[len],i)>len)
return true;
}
return false;
}
int src[maxnum],_src[maxnum];
int main()
{
p[0]=1;
FOR(i,1,maxnum-1){
p[i]=p[i-1]*key;
}
//fstream fin("G:/1.txt");
Pretreatment();
while(scanf("%d",&n),n){
// fin>>n;
tol=0;
FOR(i,1,n){
// fin>>note[i];
scanf("%d",&_src[i]);
}
FOR(i,1,n-1){
src[i]=_src[i+1]-_src[i]+88;
}
hashn[0]=0;
FOR(i,1,n-1){
hashn[i] = hashn[i-1]*key+src[i];
}
int l=0,r=n,mid;
while(l<=r){
mid = (l+r)>>1;
if(check(mid)){
l=mid+1;
tol = mid;
}
else r = mid-1;
}
tol++;
if(tol<5) tol=0;
printf("%d\n",tol);
}
return 0;
}