专栏文章

题解: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 个月前
查看原文
将数组 aa 变成元素加个数的形式,元素数组为 bb,个数为 cc,如 1,1,2,2,3,3,3\mathtt{1,1,2,2,3,3,3}bb 就是 1,2,3\mathtt{1,2,3}cc 就是 2,2,3{2,2,3}。用双指针来做。用 vv 统计是否出现,jj 表示左指针,ii 表示右指针。统计答案就是 ij+1i-j+1
  • ci=1c_i=1 时,说明 ii 不能贡献,直接将 jj 移动到 i+1i+1
  • ci>2c_i>2 时,ii 只能作为开头或结尾,若 bib_i 没出现过,统计一次答案。然后将 jj 移动到 ii,标记 bib_i 出现。
  • ci=2c_i=2 时,若 bib_i 出现过,则一直移动 jj 直到 vbi=0v_{b_i}=0。然后标记 bib_i 出现。
移动 jj 时要将 vbjv_{b_j} 变为 00
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 条评论,欢迎与作者交流。

正在加载评论...