【zzulioj 1912 小火山的爱情密码】
2016-08-19 17:56
441 查看
小火山的爱情密码
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
附上两种代码 尺取法 和 二分 :
今天又学了尺取法,好开森呀~~~
二分
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
附上两种代码 尺取法 和 二分 :
今天又学了尺取法,好开森呀~~~
#include<cstdio> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; char st[10011],pt[3]; int have[30],need[30]; int OK() { int i; for(i=0;i<26;i++) if(have[i]<need[i]) return 0; return 1; } int main() { int T,N,M,i,a,pl,ans; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); scanf("%s",st); for(i=0;i<26;i++) have[i]=need[i]=0; for(i=1;i<=M;i++) { scanf("%s%d",pt,&a); need[pt[0]-'a']=a; } ans=INF;pl=0; for(i=0;i<N;i++) { int kl=st[i]-'a'; have[kl]++; if(OK()) { while(OK()) { ans=min(ans,i+1-pl); kl=st[pl]-'a'; have[kl]--; pl++; } } } if(ans==INF) printf("-1\n"); else printf("%d\n",ans); } return 0; }
二分
#include<cstdio> int N,M,pa[15],ma[15][10011]; char st[10011],pt[15][3]; void init(char x,int y) { if(st[0]==x) ma[y][0]=1; else ma[y][0]=0; for(int i=1;i<N;i++){ if(st[i]==x) ma[y][i]=ma[y][i-1]+1;//记录该字符当前出现的总次数 else ma[y][i]=ma[y][i-1]; } } int EF(int pl) { int i,j,l,sum; for(i=pl-1,j=0;i<N;i++,j++) { sum=0; for(l=1;l<=M;l++) { int k=0; if(st[j]==pt[l][0]) k++; if(ma[l][i]-ma[l][j]+k>=pa[l])//判断该字符段的该字符出现的次数是否满足需求 sum++; } if(sum==M) return 0; } return 1; } int main() { int T,b,i; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); scanf("%s",st); for(i=1;i<=M;i++) { scanf("%s%d",pt[i],&pa[i]); init(pt[i][0],i); } int low=1,high=N,mid,ans=0; while(low<=high) { mid=(low+high)>>1; if(EF(mid)) low=mid+1; else { ans=mid; high=mid-1; } } if(ans==0) printf("-1\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- 【多校训练】ZZULIOJ 1912 小火山的爱情密码
- ZZULIOJ 1912: 小火山的爱情密码 (尺取法)
- zzuliOJ 1912:小火山的爱情密码(尺取法||二分)
- zzulioj 1912: 小火山的爱情密码
- zzulioj-1912-小火山的爱情密码【二分】【尺取法】
- 【zzuliOJ】1912 - 小火山的爱情密码(尺取法)
- zzuli 1912: 小火山的爱情密码
- 1912: 小火山的爱情密码 (尺取比二分果然更有优势)
- ZZULI 1912: 小火山的爱情密码
- ZZULI-1912 小火山的爱情密码 【尺取(OR 二分)+map】
- zzuli 1912 小火山的爱情密码
- ZZULIOJ / 郑轻OJ 1912 小火山的爱情密码(尺取法,思维)
- Zzuli OJ-----1912 小火山的爱情密码
- 【zzuli-ij】-1912: 小火山的爱情密码(尺取法,好)
- zzuli 1912: 小火山的爱情密码(二分 || 尺取)
- zzuli OJ 1912: 小火山的爱情密码【二分】
- 轻院OJ-1912 小火山的爱情密码(尺取法)
- 【暑期第二次训练赛】小火山的爱情密码(尺取法)
- 小火山的爱情密码
- 小火山 zzuli 1912(密码)