CodeForces 701C They Are Everywhere 尺取法

简单的尺取法……

先找到右边界 然后在已经有了所有字母后减小左边界……

不断优化最短区间就好了~

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define M(a,b) memset(a,b,sizeof(a))
 4 char a[200005];
 5 int zimu[205];
 6 int zimu1[205];
 7 bool in[205];
 8 int sum;
 9 int main(){
10     int n;
11     while(~scanf("%d",&n)){
12         getchar();
13         M(zimu,0);
14         M(in,false);
15         gets(a);
16         sum=0;
17         int minx=1000005;
18         for(int i=0;i<n;i++){
19             if(!in[a[i]-‘A‘]){
20                 in[a[i]-‘A‘]=true;
21                 sum++;
22             }
23         }
24         M(in,false);
25         int l=0,r=0,num=0;
26         while(r<n){
27             zimu[a[r]-‘A‘]++;
28             if(!in[a[r]-‘A‘]){
29                 in[a[r]-‘A‘]=true;
30                 num++;
31             }
32             if(sum==num){
33                 while(true){
34                     if(zimu[a[l]-‘A‘]==1) break;
35                     else zimu[a[l]-‘A‘]--;
36                     l++;  //在这里T了一发
37                 }
38                 if(r-l+1<minx) minx=r-l+1;
39             }
40             r++;
41         }
42         printf("%d\n",minx);
43     }
44     return 0;
45 }
46 /*
47
48 3
49 AaA
50 7
51 bcAAcbc
52 6
53 aaBCCe
54
55
56 */
时间: 2024-10-20 07:03:41

CodeForces 701C They Are Everywhere 尺取法的相关文章

Codeforces 660C Hard Process(尺取法)

题目大概说给一个由01组成的序列,要求最多把k个0改成1使得连续的1的个数最多,输出一种方案. 和CF 676C相似. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[333333]; 5 int main(){ 6 int n,k; 7 scanf("%d%d",&n,&k); 8 for(int i=0; i<n; ++i){ 9 scanf

Codeforces 676C Vasya and String(尺取法)

题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变且改变次数用完就让i++更正改变次数,最后更新答案.时间复杂度O(n). 另外,注意到k=0的情况. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5

河老师的新年礼物(尺取法)

河老师的新年礼物 发布时间: 2017年1月1日 15:11   最后更新: 2017年1月1日 15:13   时间限制: 1000ms   内存限制: 256M 描述 河老师的新年礼物是一个长度为n的ab串,他想要找出最长的一个子串使得这个子串中每个字符都相等,他称之为“最优子串”.当然对河老师来说这个问题太简单了,于是他加了一个条件:他可以改变这个串中的某些字符,但一次只能改变一个字符,最多能改变k次.河老师想要知道,在可以对串进行改变的前提下,这个ab串的“最优子串”的长度是多少. 输入

[CF660C]Hard Process(尺取法)

题目链接:http://codeforces.com/problemset/problem/660/C 尺取法,每次遇到0的时候补一个1,直到补完或者越界为止.之后每次从左向右回收一个0点.记录路径用两个指针卡住,每次更新即可. 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6

Codeforces 660 C. Hard Process (尺取)

题目链接:http://codeforces.com/problemset/problem/660/C 尺取法 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 static int num[int(3e5 + 5)]; 6 int n, k; 7 scanf("%d %d", &n, &k); 8 for(int i = 1; i <= n; ++i) { 9 s

尺取法总结

最近在做尺取法,总结一下 尺取法,说白了就是一个st,ed:这两个左右端点(起点.终点)在运动,适用条件就是要求一段连续的区间, 并且st(左端点)++的时候,一个更优的ed一定要大于或者等于原来的ed 所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等. 而且经常与map.set.multiset等连用 这里推荐几道题: 1.poj3061 #include<stdio.h> #include<string.h> #include<alg

luogu 1712 区间(线段树+尺取法)

题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭区间,然后线段树的每一个节点表示一个半开半闭区间. 接着我们注意到需要求最小的花费,且这个花费只与选择的区间集合中的最大长度和最小长度有关. 这意味着如果最大长度和最小长度一定,我们显然是需要把中间长度的区间尽量的选择进去使答案不会变的更劣. 不妨把区间按长度排序,枚举每个最小长度区间,然后最大区间

poj 3320 Jessica&#39;s Reading Problem(尺取法+map/hash)

题目:http://poj.org/problem?id=3320 题意:给定N个元素的数组,找出最短的一段区间使得区间里面的元素种类等于整个数组的元素种类. 分析:暴力枚举区间的起点x,然后找到最小的y,使得区间[x,y]满足条件,x向有移位后变成x',现在的y'肯定不至于在y的左边.存状态的话map和hash都可以. map代码: #include <iostream> #include <set> #include <map> #include <cstdi

hihocoder-1483区间价值 (二分+尺取法)

题目链接: 区间价值 给定n个数A1...An,小Ho想了解AL..AR中有多少对元素值相同.小Ho把这个数目定义为区间[L,R]的价值,用v[L,R]表示. 例如1 1 1 2 2这五个数所组成的区间的价值为4. 现在小Ho想知道在所有的的v[L,R](1 <= L <= R <= n)中,第k小的值是多少. Input 第一行一个数T(T<=10),表示数据组数. 对于每一组数据: 第一行两个数n,k(1<=n<=200,000,1<=k<=n*(n+1