zzulioj-1912-小火山的爱情密码【二分】【尺取法】
2016-08-11 12:19
579 查看
题目链接:点击打开链接
128 MB
Submit: 237 Solved: 62
SubmitStatusWeb
Board
小火山觉得很容易,但是他想要知道他至少得截取多长的字符串。
的种类.(字符只包含小写英文字母)
个数(没有重复字符种类),然后有m行,每行第一个是一个字符,然后是一个整数x(x<=50),表示这种字符的的要求数量。
二分:
尺取法:也就是开两个指针 l ,r 。先让 r 加到满足条件,然后更新最短区间,然后去掉 s [ l ] 的贡献,l ++,再次让 r 加到满足条件
1912: 小火山的爱情密码
Time Limit: 1 Sec Memory Limit:128 MB
Submit: 237 Solved: 62
SubmitStatusWeb
Board
Description
小火山获得了一个字符串,然而大火山让小火山从里面截取一段字符串,并且让小火山截取的字符串满足一些字符达到一定数量。小火山觉得很容易,但是他想要知道他至少得截取多长的字符串。
Input
首先是一个整数t(t<=100),表示测试数据组数。接下来是两个整数n和m(n<=10000, m<=10),n表示字符串的长度,m表示要满足一定数量的字符的种类.(字符只包含小写英文字母)
个数(没有重复字符种类),然后有m行,每行第一个是一个字符,然后是一个整数x(x<=50),表示这种字符的的要求数量。
Output
输出最小长度,如果达不到要求输出-1Sample Input
1 6 3 cancan c 2 a 2 n 2
Sample Output
6
二分:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MAX=1e4+10; int n,m; int dp[MAX][26]; // dp[i][j]=k 表示字符串前 i位字母 j 有 k 个 int need[MAX];<span style="white-space:pre"> </span>// 表示字母需要达到的数量 char str[MAX]; bool judge2(int x,int y) { for(int i=0;i<26;i++) { if(!need[i]) continue; if(dp[x+y][i]-dp[x][i]+(str[x]==i+'a')<need[i]) return 0; } return 1; } bool judge1(int mid) { if(mid==0) return 0; for(int i=0;i<=n-mid;i++) { if(judge2(i,mid-1)) return 1; } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d %s",&n,&m,str); memset(dp,0,sizeof(dp)); memset(need,0,sizeof(need)); dp[0][str[0]-'a']++; for(int i=1;i<n;i++) { for(int j=0;j<26;j++) { dp[i][j]=dp[i-1][j]; } dp[i][str[i]-'a']++; } int x; char s[2]; for(int i=0;i<m;i++) { scanf("%s%d",s,&x); need[s[0]-'a']=x; } int ans=-1,left=m,right=n; while(left<=right) { int mid=(left+right)>>1; if(judge1(mid)) { ans=mid; right=mid-1; } else left=mid+1; } printf("%d\n",ans); } return 0; }
尺取法:也就是开两个指针 l ,r 。先让 r 加到满足条件,然后更新最短区间,然后去掉 s [ l ] 的贡献,l ++,再次让 r 加到满足条件
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MAX=1e4+10; const int INF=0xfffffff; int n,m; char str[MAX]; int num[MAX]; int need[MAX]; bool judge() { for(int i=0;i<26;i++) { if(num[i]<need[i]) return 0; } return 1; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d %s",&n,&m,str); memset(num,0,sizeof(num)); memset(need,0,sizeof(need)); char s[2]; int k; while(m--) { scanf("%s %d",s,&k); need[s[0]-'a']=k; } int ans=INF,cnt=0; for(int i=0;i<n;i++) { num[str[i]-'a']++; while(judge()) { ans=min(ans,i-cnt+1); num[str[cnt]-'a']--; cnt++; } } if(ans==INF) ans=-1; printf("%d\n",ans); } return 0; }
相关文章推荐
- zzuliOJ 1912:小火山的爱情密码(尺取法||二分)
- zzuli OJ 1912: 小火山的爱情密码【二分】
- zzuli 1912: 小火山的爱情密码(二分 || 尺取)
- zzulioj 1912: 小火山的爱情密码
- 【zzuliOJ】1912 - 小火山的爱情密码(尺取法)
- 【多校训练】ZZULIOJ 1912 小火山的爱情密码
- 1912: 小火山的爱情密码 (尺取比二分果然更有优势)
- 【zzulioj 1912 小火山的爱情密码】
- ZZULI-1912 小火山的爱情密码 【尺取(OR 二分)+map】
- ZZULIOJ 1912: 小火山的爱情密码 (尺取法)
- zzuli 1912: 小火山的爱情密码
- ZZULI 1912: 小火山的爱情密码
- 轻院OJ-1912 小火山的爱情密码(尺取法)
- zzuli 1912 小火山的爱情密码
- 【zzuli-ij】-1912: 小火山的爱情密码(尺取法,好)
- Zzuli OJ-----1912 小火山的爱情密码
- ZZULIOJ / 郑轻OJ 1912 小火山的爱情密码(尺取法,思维)
- 【暑期第二次训练赛】小火山的爱情密码(尺取法)
- 小火山 zzuli 1912(密码)
- 小火山的爱情密码