题解:AT_abc381_d [ABC381D] 1122 Substring
zhouruoheng · · 题解
将数组
- 当
c_i=1 时,说明i 不能贡献,直接将j 移动到i+1 。 - 当
c_i>2 时,i 只能作为开头或结尾,若b_i 没出现过,统计一次答案。然后将j 移动到i ,标记b_i 出现。 - 当
c_i=2 时,若b_i 出现过,则一直移动j 直到v_{b_i}=0 。然后标记b_i 出现。
移动
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N],b[N],c[N];
int v[N];
void solve()
{
cin>>n;
int tot=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=a[i-1]) b[++tot]=a[i],c[tot]=1;
else c[tot]++;
}
int j=1,ans=0;
for(int i=1;i<=tot;i++)
{
if(c[i]<2) while(j<=i) v[b[j++]]=0;
else if(c[i]>2)
{
if(!v[b[i]]) ans=max(ans,(i-j+1)*2);
while(j<i) v[b[j++]]=0;
v[b[i]]=1;
}
else
{
while(j<=i&&v[b[i]]) v[b[j++]]=0;
v[b[i]]=1;
}
if(j<=i) ans=max(ans,(i-j+1)*2);
}
cout<<ans<<'\n';
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
solve();
return 0;
}