hdu 5671 String(求有多少个子串,包含有至少k(1≤k≤26)个不同的字母)
来源:互联网 发布:华三交换机ip和mac绑定 编辑:程序博客网 时间:2024/06/03 01:39
题意:
有一个 10≤长度≤1,000,000 的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1≤k≤26)个不同的字母?
思路:
如果l,r中正好包含有k个不同的子串,那么从l开始的包含k个不同字符的串有strlen(s)-r+1
所以我们只需要计算出每个l对应的正好包含k个不同字符的r便可以了,利用双指针便可以完成。
#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define mem(a, b) memset(a, b, sizeof(a))typedef long long ll;const int maxn=1010000;char s[maxn];int C[27],len,k;int main(){ int _; scanf("%d",&_); while(_--){ scanf("%s",s+1); scanf("%d",&k); mem0(C); len=strlen(s+1); int ed=0,count=0; ll ans=0; for(int i=1;i<=len;i++){ if(count>=k){ C[s[i]-'a']--; if(C[s[i]-'a']==0) count--; ans+=(len-ed+1); continue; } ed++; for(;ed<=len;ed++){ if(C[s[ed]-'a']==0) count++; C[s[ed]-'a']++; if(count>=k) break; } if(count<k||ed>len) break; ans+=(len-ed+1); C[s[i]-'a']--; if(C[s[i]-'a']==0) count--; } printf("%lld\n",ans); } return 0;}
0 0
- hdu 5671 String(求有多少个子串,包含有至少k(1≤k≤26)个不同的字母)
- hdoj String 5672 (字符串模拟)求至少有k个不重复的字符的子串个数
- 求k个数组包含每个数组至少一个元素的最小范围(待字闺中,备忘)
- hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)
- 给出宫,求宫的开始列号(K*K,K*K)数独 一共有K*K*K*K个格子
- 求两个数的不同位有多少个
- 求字符串中有多少个子字符串
- hdu 1358 Period(给定一个字符串,求有多少个前缀(包括自己本身),它是由k(k>2,并且尽量大)个循环节组成的)
- 长度为n的数组,取其中k个,要求和为sum,求有多少种取法
- 求一个区间有多少个数能整除k
- 字符串aba ccde232d ehdba cac 有多少个不同字母,并且每个不同字母有多少个!
- 求一个数二进制位中有多少个 1 的不同解法
- Leetcode667. 求一种数组排列方式使数组相邻数值对有k个不同绝对值
- 【HDU 5944】【暴力】Fxx and string 【给定一个字符串s,求有多少个三元组(i,j,k)满足i,j,k是等比数列且s[i]=='y'&&s[j]=='r'&&s[k]=='x'】
- 有 n 个硬币,一开始全部正面朝上,每次可以翻转 k 个硬币( k 小于 n ),那么至少要 p 次翻转,才能让所有硬币反面朝上,求 p 的值
- 【容斥原理】求1~n有多少个数与k互质
- 有多少个不同的子串?-- 后缀数组
- 求两个数之间有多少个比特位不同
- [ZOJ 3682] E - Cup 3 (背包DP计数 + 滚动数组)
- IOS学习 绘图 UIBezierPath 绘饼状图
- optparse模块
- php面试中的经典问题
- 欢迎使用CSDN-markdown编辑器
- hdu 5671 String(求有多少个子串,包含有至少k(1≤k≤26)个不同的字母)
- [django]django 部署,gunicorn、virtualenv、nginx
- leetcode 60. Permutation Sequence
- spring 配置文件详解-个人学习笔记
- HDU 3639Hawk-and-Chicken 强连通分量分解 + dfs
- 算法竞赛入门第二章2-2
- 使用KLEE Docker image进行程序分析
- java并发之ConcurrentHashMap
- 01背包 2016.5.1