1912: 小火山的爱情密码
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 180 Solved: 45
Submit Status Web Board
Description
小火山获得了一个字符串,然而大火山让小火山从里面截取一段字符串,并且让小火山截取的字符串满足一些字符达到一定数量。
小火山觉得很容易,但是他想要知道他至少得截取多长的字符串。
Input
首先是一个整数t(t<=100),表示测试数据组数。接下来是两个整数n和m(n<=10000, m<=10),n表示字符串的长度,m表示要满足一定数量的字符
的种类.(字符只包含小写英文字母)
个数(没有重复字符种类),然后有m行,每行第一个是一个字符,然后是一个整数x(x<=50),表示这种字符的的要求数量。
Output
输出最小长度,如果达不到要求输出-1
Sample Input
1
6 3
cancan
c
2
a 2
n 2
Sample Output
6
HINT
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
usingnamespace std;
constint N = 100100;
charstr[N];
intvisit[N], flag[N];
intjudge();
intmain()
{
intt;
scanf("%d", &t);
while(t--)
{
intn, m, x, y;
scanf("%d %d", &n, &m);
scanf("%s",str);
memset(flag,0,sizeof(flag));
for(inti=0;str[i];i++)
{
x=str[i]-'a';
flag[x]++;
}
memset(visit,0,sizeof(visit));
while(m--)
{
charch[5];
scanf(" %s %d",ch, &x);
y=ch[0]-'a';
visit[y]+=x;
}
intans=0;
for(inti=0;i<=27;i++)
{
if(flag[i]<visit[i])
{
ans=1;
break;
}
}
if(ans==1)
{
printf("-1\n");
continue;
}
intlen=strlen(str);
intl=0, r=0, h=0,length=100000;
memset(flag,0,sizeof(flag));
while(1)
{
while(l<=r&&r<len&&h==0)
{
x=str[r]-'a';
flag[x]++;
if(flag[x]<visit[x])
{
r++;
}
elseif(judge()==1)
{
h=1;
break;
}
else
{
r++;
}
}
if(h==0)
{
break;
}
length=min(r-l+1,length);
x=str[l]-'a';
flag[x]--;
l++;
if(flag[x]<visit[x])
{
h=0;
r++;
}
}
printf("%d\n",length);
}
return0;
}
intjudge()
{
for(inti=0;i<=27;i++)
{
if(flag[i]<visit[i])
{
return-1;
}
}
return1;
}
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
usingnamespace std;
constint N = 100100;
charstr[N];
intvisit[N], flag[N];
intjudge();
intmain()
{
intt;
scanf("%d", &t);
while(t--)
{
intn, m, x, y;
scanf("%d %d", &n, &m);
scanf("%s",str);
memset(flag,0,sizeof(flag));
for(inti=0;str[i];i++)
{
x=str[i]-'a';
flag[x]++;
}
memset(visit,0,sizeof(visit));
while(m--)
{
charch[5];
scanf(" %s %d",ch, &x);
y=ch[0]-'a';
visit[y]+=x;
}
intans=0;
for(inti=0;i<=27;i++)
{
if(flag[i]<visit[i])
{
ans=1;
break;
}
}
if(ans==1)
{
printf("-1\n");
continue;
}
intlen=strlen(str);
intl=0, r=0, h=0,length=100000;
memset(flag,0,sizeof(flag));
while(1)
{
while(l<=r&&r<len&&h==0)
{
x=str[r]-'a';
flag[x]++;
if(flag[x]<visit[x])
{
r++;
}
elseif(judge()==1)
{
h=1;
break;
}
else
{
r++;
}
}
if(h==0)
{
break;
}
length=min(r-l+1,length);
x=str[l]-'a';
flag[x]--;
l++;
if(flag[x]<visit[x])
{
h=0;
r++;
}
}
printf("%d\n",length);
}
return0;
}
intjudge()
{
for(inti=0;i<=27;i++)
{
if(flag[i]<visit[i])
{
return-1;
}
}
return1;
}