Codeforces 701C They Are Everywhere(Two pointers+STL)

【题目链接】 http://codeforces.com/problemset/problem/701/C

【题目大意】

给出 一个字符串,里面包含一定种类的字符,求出一个最短的子串,使得其包含该字符串中的所有种类的字符

【题解】

  利用双指针,每次找到包含所有字符的串,用这个串的长度去更新答案,在判断该字符在选定串中出现次数的时候可以调用map,而统计不同种类字符个数则可以利用STL中的set进行统计。

【代码】

#include<set>
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans,L=0,R=0,cnt=0;
set<int> s;
map<int,int> f;
char a[100005];
int main(){
    scanf("%d %s",&n,a);
    for(int i=0;a[i]!=‘\0‘;i++)s.insert(a[i]);
    int size=s.size(); ans=n;
    while(1){
        while(R<n&&cnt<size){
            if(!f[a[R]])cnt++;
            f[a[R++]]++;
        }while(f[a[L]]>1)f[a[L++]]--;
        if(cnt==size){
            ans=min(ans,R-L);
            f[a[L++]]--;cnt--;
        }if(R==n)break;
    }return printf("%d\n",ans),0;
}

  

时间: 2024-08-26 12:47:35

Codeforces 701C They Are Everywhere(Two pointers+STL)的相关文章

CodeForces 701C They Are Everywhere(map的应用)

这个题比较好的解决办法,我觉得还是map,map的size可以很快的知道我们选了几个字母,而且可以作为计数器,知道每一个字母出现了多少次, erase函数可以清除掉一个元素. 所以,定义两个指针L和R,当选择的数够了sum个以后,我们移动L指针,开始删除字母,直到不满足为止,然后移动R指针,看有没有其他的满足答案,并及时更新答案. 代码及注释如下: ps:被这个题给虐了……(真是有愧于队友赐我的map小王子的称号……) #include<iostream> #include<cstdio

CodeForces 444C. DZY Loves Physics(枚举+水题)

转载请注明出处:http://blog.csdn.net/u012860063/article/details/37509207 题目链接:http://codeforces.com/contest/445/problem/C DZY Loves Physics DZY loves Physics, and he enjoys calculating density. Almost everything has density, even a graph. We define the densi

codeforces 459C Pashmak and Buses(模拟,组合数A)

题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>

Codeforces 294B Shaass and Bookshelf(记忆化搜索)

题目 记忆化搜索(深搜+记录状态) 感谢JLGG //记忆话搜索 //一本书2中状态,竖着放或者横着放 //初始先都竖着放,然后从左边往右边扫 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[110][210][210];//dp[第几个][厚度][宽度] int n; int a[110],b[110]; int rec(int i,int th,

nyist oj 19 擅长排列的小明(dfs搜索+STL)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选

hdu 4585 Shaolin两种方法(暴力和STL)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585 Problem Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temple every year, trying to be a monk there. The mast

POJ - 3320 Jessica&#39;s Reading Problem(尺取法+STL)

题目链接:http://poj.org/problem?id=3320 题意:一本n页的书(有很多重复的页),要求连续最少页数把这本书每种页都包括进去,求出最少页数. 例如1 8 8 8 1 就1和8两种页,第一次1 8连续两页就把每种页都包括进去了. 尺取法:顾名思义就是一段一段的取.一开始一直往后取,符合条件,然后进行前面减少操作,不符合条件再往后取. 如此重复,得到最优的解.这道题目给出的页的标记好像有特别大的,直接用数组的话会爆炸. 试过用vector,但是对vector的操作太麻烦了.

Codeforces Gym101257F:Islands II(求割点+思维)

http://codeforces.com/gym/101257/problem/F 题意:给出一个n*m的地图,上面相同数字的代表一个国家,问对于每个国家有多少个国家在它内部(即被包围).例如第一个样例,1包围2,2包围3,所以1包围2和3,2包围3. 思路:昨晚tmk大佬给我们讲了一下这题.对于一个国家,将和它相邻的国家连边,最后形成一个图. 可以发现,如果从随便一个点出发DFS,如果失去了某个点之后,导致整个图不连通了,那么这个点就一定包围了一些国家. 例如下面这个样例: 1 1 1 1

CodeForces 1000B Light It Up(贪心、思维)

https://codeforces.com/problemset/problem/1000/B 题意: 一个模拟思维题.就是有一盏灯,0时刻开着.n次操作,你可以在其中加入一次操作(或者不加),操作为:a[i]时刻按一下开关,状态变为相反状态(开->关or关->开).问灯亮着的时长最长为多少? 样例一0~4开(时长为4-0),4~6关(时长为6-4),6~7开(时长为7-6),7~10关(时长为10-7),可以这这些时间点中加操作使开灯时间变长 在3处加操作,开灯时长变为0-3(开)3-4(