B:​http://codeforces.com/contest/1354/problem/B

题意:

找出同时含有1,2,3的最短序列的长度。

解析:

比赛代码被hack了,超时。赛后看了题解,才觉得自己真是太蠢了。

p[1],p[2],p[3]来记录最后出现对应数字的位置。当三者都出现时,更新最小值。

#include<iostream>
#include<cstring>
#include<map>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int p[5];
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
p[1]=-1;
p[2]=-1;
p[3]=-1;
int minn=maxn;
int len=s.length();
p[s[0]-'0']=0;
for(int i=1;i<len;i++)
{
int md=s[i]-'0';
p[md]=i;
if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1)
{
if(md==1)
{
minn=min(minn,p[1]-min(p[2],p[3])+1);
}
if(md==2)
{
minn=min(minn,p[2]-min(p[1],p[3])+1);
}
if(md==3)
minn=min(minn,p[3]-min(p[2],p[1])+1);
}
}

if(minn==maxn)
cout<<"0"<<endl;
else
cout<<minn<<endl;
}
}