纯水题,也可以尺取法模拟。
几个易错数据:
6
1 1 1 1 1 2
2
1 2
1
1
5
1 2 2 2 2
代码:
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string>
#include<string.h>
using namespace std;
int a[1000000+100]={0};
int ge[1000000+100]={0};
int main()
{
//freopen("F://input.txt","r",stdin);
memset(a,0,sizeof(a));
memset(ge,0,sizeof(ge));
int t;
scanf("%d",&t);
int i,q,w,l,r;
for(i=1;i<=t;i++)
{
scanf("%d",&a[i]);
}
if(t==1||t==2)
{
printf("%d\n",t);
return 0;
}
l=1,r=2;
int max=0;
int shu1=a[1],shu2=(a[2]==a[1]?0:a[2]);
ge[shu1]+=1;
if(shu2!=0)
ge[shu2]+=1;
else
ge[shu1]+=1;
for(;;)
{
if(r==t)break;
if(shu2==0)
{
r+=1;
if(shu1==a[r])
{
ge[shu1]+=1;
if(max<r-l+1)max=r-l+1;
continue;
}
else
{
shu2=a[r];
ge[shu2]+=1;
if(max<r-l+1)max=r-l+1;
continue;
}
}
if(ge[shu1]==0||ge[shu2]==0)
{
r+=1;
if(ge[shu1]==0){
shu1=a[r];
ge[shu1]+=1;
}
if(ge[shu2]==0){
shu2=a[r];
ge[shu2]+=1;
}
if(max<r-l+1)max=r-l+1;
continue;
}
if(a[r+1]!=shu1&&a[r+1]!=shu2&&shu1!=0&&shu2!=0)
{
ge[a[l]]-=1;
l+=1;
if(max<r-l+1)max=r-l+1;
continue;
}
{
r+=1;
ge[a[r]]+=1;
if(max<r-l+1)max=r-l+1;
continue;
}
}
printf("%d\n",max);
return 0;
}