【HDU - 5672】String(尺取法)
题干:
There is a string SS.SS only contain lower case English character.(10≤length(S)≤1,000,000)(10≤length(S)≤1,000,000)
How many substrings there are that contain at least k(1≤k≤26)k(1≤k≤26) distinct characters?
Input
There are multiple test cases. The first line of input contains an integer T(1≤T≤10)T(1≤T≤10) indicating the number of test cases. For each test case:
The first line contains string SS.
The second line contains a integer k(1≤k≤26)k(1≤k≤26).
Output
For each test case, output the number of substrings that contain at least kk dictinct characters.
Sample Input
2 abcabcabca 4 abcabcabcabc 3
Sample Output
0 55
题目大意:
问有多少个 含有不少于k种字符的 子字符串。
解题报告:
尺取法,但是我是以右端点为一个记录,即 表示以第s[r]个字符为结尾,有多少个字符串满足。这种方法需要处理cnt>k的情况。
还有一种方法,每次统计以s[l]为起始的,有多少个子字符串满足,这种不需要考虑cnt>k的情况。
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX = 1e6 +5;
char s[MAX];
int l,r,cnt,k,num[30];
ll ans;
int main()
{int t;cin>>t;while(t--) {scanf("%s",s+1);scanf("%d",&k);memset(num,0,sizeof num);int len = strlen(s+1);l = 1,r = 1;cnt = 0;ans = 0;while(l<=len && r <=len) {if(num[s[r] - 'a'] == 0) {cnt++;}num[s[r] - 'a']++;while(cnt > k) {while(num[s[l]-'a'] >=1) {num[s[l]-'a']--;if(num[s[l]-'a']==0) cnt--;l++;if(cnt == k) break;}}if(cnt == k) {while(num[s[l]-'a'] > 1) num[s[l]-'a']--,l++;ans += l;}r++;}printf("%lld\n",ans);}return 0 ;}
/*
1
aabcc
3
*/
错误代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX = 1e6 +5;
char s[MAX];
int l,r,cnt,k,num[30];
ll ans;
int main()
{int t;cin>>t;while(t--) {scanf("%s",s+1);scanf("%d",&k);memset(num,0,sizeof num);int len = strlen(s+1);l = 1,r = 1;cnt = 0;ans = 0;while(l<=len && r <=len) {if(num[s[r] - 'a'] == 0) {cnt++;}num[s[r] - 'a']++;if(cnt == k) {while(num[s[l]-'a'] > 1) num[s[l]-'a']--,l++;ans += l;}r++;}printf("%lld\n",ans);}return 0 ;}
测试样例:
1
abc
2
应该输出3,但是输出了1。
AC代码2:(左端点的)
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000200];
int vis[30];
int main()
{int t,k;scanf("%d", &t);while (t--){scanf("%s%d", s,&k);int len = strlen(s), sum = 0, r = -1;long long ans = 0;memset(vis, 0, sizeof(vis));for (int i = 0; i < len; i++){while (sum < k&&r+2<=len){r++;vis[s[r] - 'a']++;if (vis[s[r] - 'a'] == 1)sum++;}if (sum==k)ans += len - r;vis[s[i] - 'a']--;if (vis[s[i] - 'a'] == 0)sum--;}printf("%I64d\n", ans);}
}
【HDU - 5672】String(尺取法)相关推荐
- hdu 5672(尺取法)
题意:有一个10<=长度<=1000000的字符串,仅由小写字母组成.求有多少子串,包含至少k(1<= k <= 26)个不同的字母. 解题思路:利用尺取法求符合条件的临界区间 ...
- hdu 5358(尺取法)
解题思路:这题可以利用尺取法,不过需要两个指针.如果采用一个指针,会出现这种情况,由于是取对数,所以中间可能会有很多log2S(i,j)的值相等,如果只有一个指针,会使得一些区间没有被算进去.比如0, ...
- 解题报告 (十三) 尺取法
文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...
- Vasya and String CodeForces - 676C(尺取法)
High school student Vasya got a string of length n as a birthday present. This string consists of le ...
- Codeforces 1548B Integers Have Friends 尺取法 Hdu 7073 Integers Have Friends 2.0 力能扛鼎随机算法
文章目录 题意 题解 CF1548B 题解 Hdu 7073 CF1548B HDU7073 题意 定义数的好友组为一个集合SSS,取正整数m>1,∀x∈s,xmodmm>1,\foral ...
- hdu 5178(尺取法)
pairs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem De ...
- hdu 1937(尺取法)
题意:给定一个R*C的矩阵,选择一个面积最小的子矩阵,使得其内部'.'的个数>=k. 解题思路:这道题如果时普通的枚举,会要达到O(N^5)严重超时.这里可以采用高效的枚举方法--尺取法. 首先 ...
- hdu6119 小小粉丝度度熊【尺取法(滑动窗口)】
这是2017百度之星初赛二的赛题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 代码思路: 排序后合并交叉区间 使用尺取法(滑动窗口法),每 ...
- 【常用技巧精选】尺取法
整理的算法模板合集: ACM模板 目录 1.反向扫描 1 找指定和的整数对 A.UVA1121 Subsequence B.POJ 3320 Jessica's Reading Problem C.l ...
最新文章
- RPC是什么?为什么要学习RPC?
- spring之AOP的简单实例
- Linux_系统破坏性修复实验
- Java applet java.lang.OutOfMemoryError: Java heap space
- K8S-网络模型、POD/RC/SVC YAML 语法官方文档
- github RL: DP
- Github标星3.7k:微软出的数据科学入门课程(附下载)
- OMNet++ 4.0
- IDEA下的使用git
- 数学,原来可以这么美!
- 下标索引必须为正整数类型或逻辑类型_Python3 基本数据类型
- Javascript——进阶(事件、数组操作、字符串操作、定时器)
- 2019全国智能机器人与SLAM技术博士生论坛第二轮通知
- Mathematica图片修复
- CentOS8 同步时间chrony ntpdate已无法使用
- 一文读懂数据平台、大数据平台、数据中台
- 2018蓝桥杯C++A组:三角形面积(海伦公式;向量的叉积)
- MT4跟单软件的API跟单模式有多少种?
- Python如何解决中文乱码
- Scintilla Markers Margins
热门文章
- 843. n-皇后问题
- 枚举命名规范_UE4 C++基础教程 - 编码规范
- 如何写一篇MBA论文-涉及matlab建模
- sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器
- python终止线程_Python里怎么终止一个线程
- 手写tomcat socket closed_【消费电子】:重在阅读,新增手写 BOOX Nova Pro 体验评测...
- python3.6生成exe_Python 3.6打包成EXE可执行程序的实现
- java enumeration 排序_Java如何对java.util.Enumeration进行排序?
- 手机来电秀怎么开启_360手机卫士怎么设置来电秀 360手机卫士来电秀设置方法...
- shell 执行失败重试_Uipath 机器人总是运行失败怎么办?