专栏文章
题解:AT_abc381_d [ABC381D] 1122 Substring
AT_abc381_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mir16rhr
- 此快照首次捕获于
- 2025/12/04 14:04 3 个月前
- 此快照最后确认于
- 2025/12/04 14:04 3 个月前
将数组 变成元素加个数的形式,元素数组为 ,个数为 ,如 , 就是 , 就是 。用双指针来做。用 统计是否出现, 表示左指针, 表示右指针。统计答案就是 。
- 当 时,说明 不能贡献,直接将 移动到 。
- 当 时, 只能作为开头或结尾,若 没出现过,统计一次答案。然后将 移动到 ,标记 出现。
- 当 时,若 出现过,则一直移动 直到 。然后标记 出现。
移动 时要将 变为 。
CPP#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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...