CF1354B Terminal String(思维)

题意:

给出一个序列,只可能出现123,询问最长的同时包含1的子序列的长度。

题解:

用三个变量保存123的最近的上一次出现的位置,用当前位置减去三个前驱位置的最小值再加1,就是符合条件序列的长度。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
char s[maxn];
int a[maxn];
int T;
int main () {
    scanf("%d",&T);
    while (T--) {
        scanf("%s",s);
        int N=strlen(s);
        for (int i=1;i<=N;i++) a[i]=s[i-1]-'0';
        int pre[4]={0};
        int Min=1e9;
        for (int i=1;i<=N;i++) {
            pre[a[i]]=i;
            if (pre[1]&&pre[2]&&pre[3]) {
                Min=min(Min,i-min(pre[1],min(pre[2],pre[3]))+1);
            }
        }
        if (Min==1e9) Min=0;
        printf("%d\n",Min);
    }
}

 

posted @ 2020-05-19 16:43  zlc0405  阅读(147)  评论(0编辑  收藏  举报