题干:

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(尺取法)相关推荐

  1. hdu 5672(尺取法)

    题意:有一个10<=长度<=1000000的字符串,仅由小写字母组成.求有多少子串,包含至少k(1<= k <= 26)个不同的字母. 解题思路:利用尺取法求符合条件的临界区间 ...

  2. hdu 5358(尺取法)

    解题思路:这题可以利用尺取法,不过需要两个指针.如果采用一个指针,会出现这种情况,由于是取对数,所以中间可能会有很多log2S(i,j)的值相等,如果只有一个指针,会使得一些区间没有被算进去.比如0, ...

  3. 解题报告 (十三) 尺取法

    文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...

  4. Vasya and String CodeForces - 676C(尺取法)

    High school student Vasya got a string of length n as a birthday present. This string consists of le ...

  5. 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 ...

  6. hdu 5178(尺取法)

    pairs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem De ...

  7. hdu 1937(尺取法)

    题意:给定一个R*C的矩阵,选择一个面积最小的子矩阵,使得其内部'.'的个数>=k. 解题思路:这道题如果时普通的枚举,会要达到O(N^5)严重超时.这里可以采用高效的枚举方法--尺取法. 首先 ...

  8. hdu6119 小小粉丝度度熊【尺取法(滑动窗口)】

    这是2017百度之星初赛二的赛题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 代码思路: 排序后合并交叉区间 使用尺取法(滑动窗口法),每 ...

  9. 【常用技巧精选】尺取法

    整理的算法模板合集: ACM模板 目录 1.反向扫描 1 找指定和的整数对 A.UVA1121 Subsequence B.POJ 3320 Jessica's Reading Problem C.l ...

最新文章

  1. RPC是什么?为什么要学习RPC?
  2. spring之AOP的简单实例
  3. Linux_系统破坏性修复实验
  4. Java applet java.lang.OutOfMemoryError: Java heap space
  5. K8S-网络模型、POD/RC/SVC YAML 语法官方文档
  6. github RL: DP
  7. Github标星3.7k:微软出的数据科学入门课程(附下载)
  8. OMNet++ 4.0
  9. IDEA下的使用git
  10. 数学,原来可以这么美!
  11. 下标索引必须为正整数类型或逻辑类型_Python3 基本数据类型
  12. Javascript——进阶(事件、数组操作、字符串操作、定时器)
  13. 2019全国智能机器人与SLAM技术博士生论坛第二轮通知
  14. Mathematica图片修复
  15. CentOS8 同步时间chrony ntpdate已无法使用
  16. 一文读懂数据平台、大数据平台、数据中台
  17. 2018蓝桥杯C++A组:三角形面积(海伦公式;向量的叉积)
  18. MT4跟单软件的API跟单模式有多少种?
  19. Python如何解决中文乱码
  20. Scintilla Markers Margins

热门文章

  1. 843. n-皇后问题
  2. 枚举命名规范_UE4 C++基础教程 - 编码规范
  3. 如何写一篇MBA论文-涉及matlab建模
  4. sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器
  5. python终止线程_Python里怎么终止一个线程
  6. 手写tomcat socket closed_【消费电子】:重在阅读,新增手写 BOOX Nova Pro 体验评测...
  7. python3.6生成exe_Python 3.6打包成EXE可执行程序的实现
  8. java enumeration 排序_Java如何对java.util.Enumeration进行排序?
  9. 手机来电秀怎么开启_360手机卫士怎么设置来电秀 360手机卫士来电秀设置方法...
  10. shell 执行失败重试_Uipath 机器人总是运行失败怎么办?