rt, 整场爆炸, 下方所有记录均 WA 5.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double Lf;
typedef double lf;
const ll N=5e6+5;
ll n,a[N];
queue<ll> Q;
ll b[N],m=0,ans=0;
bool I[N];
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
ll lst=-1;
for(ll i=1;i<=n;i++)
{
if(a[i]==lst)
{
b[m]=a[i];
lst=-1;
}
else
{
b[++m]=-1;
lst=a[i];
}
}
for(ll i=1;i<=m;i++)
{
if(b[i]==-1)
{
while(!Q.empty())
{
I[Q.front()]=false;
Q.pop();
}
ans=max(ans,(ll)Q.size());
continue;
}
ans=max(ans,(ll)Q.size());
while(I[b[i]]==true)
{
I[Q.front()]=false;
Q.pop();
}
I[b[i]]=true;
Q.push(b[i]);
ans=max(ans,(ll)Q.size());
}
printf("%lld\n",ans*2);
}
大致思路: 把相邻的相同元素两两缩成一个, 剩下落单的替换为 -1, 对处理后的序列 O(n) 扫一遍, 把遇到的元素加到队列尾部, 不断出队直到队中没有相同元素.
挂了还是假了? 一直WA5, 从头到尾.