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); } }