codeforces #271D Good Substrings
原题链接:http://codeforces.com/problemset/problem/271/D
题目原文:
2 seconds
512 megabytes
standard input
standard output
You've got string s, consisting of small English letters. Some of the English letters are good, the rest are bad.
A substring s[l...r] (1 ≤ l ≤ r ≤ |s|) of string s = s1s2...s|s| (where |s| is the length of string s) is string slsl + 1...sr.
The substring s[l...r] is good, if among the letters sl, sl + 1, ..., sr there are at most k bad ones (look at the sample's explanation to understand it more clear).
Your task is to find the number of distinct good substrings of the given string s. Two substrings s[x...y] and s[p...q] are considered distinct if their content is different, i.e. s[x...y] ≠ s[p...q].
The first line of the input is the non-empty string s, consisting of small English letters, the string's length is at most 1500 characters.
The second line of the input is the string of characters "0" and "1", the length is exactly 26 characters. If the i-th character of this string equals "1", then the i-th English letter is good, otherwise it's bad. That is, the first character of this string corresponds to letter "a", the second one corresponds to letter "b" and so on.
The third line of the input consists a single integer k (0 ≤ k ≤ |s|) — the maximum acceptable number of bad characters in a good substring.
Print a single integer — the number of distinct good substrings of string s.
ababab
01000000000000000000000000
1
5
acbacbacaa
00000000000000000000000000
2
8
In the first example there are following good substrings: "a", "ab", "b", "ba", "bab".
In the second example there are following good substrings: "a", "aa", "ac", "b", "ba", "c", "ca", "cb".
题意:
这种题目没什么好讲的,就是让你从一个字符串 s 找出有多少个不同字串并且字串中包含的所有字符是坏的总数不超过k;
解题方法:
NO.1 hash+map

我开始就想用map去solve它,不过当时没想到map的复杂度那么大,就直接把字串放map里面比较,所以就超时了。今天加个hash就可以了,不过时间复杂度还是很大。不建议使用。
unordered_map 无序map,比map时间复杂度低效果差不多就是这样子。不过用法都是一样的。
1 #include <iostream>
2 #include <cstdio>
3 #include <queue>
4 #include <algorithm>
5 #include <stack>
6 #include <cmath>
7 #include <map>
8 #include <cstring>
9 #include <bits/stdc++.h>
10 using namespace std;
11 #define mod 1000000007
12 #define PI acos(-1.0)
13 typedef long long ll;
14 //const int INF=0x3f3f3f3f;
15 //const ll INF=1000000000000000000;
16 //priority_queue<int, vector<int>, greater<int> >p;
17 int main()
18 {
19 unordered_map<ll,int>m;
20 char s[2000];
21 char a[30];
22 ll k,sum=0;
23 scanf("%s",s);
24 scanf("%s",a);
25 scanf("%lld",&k);
26 int b[2000]={0};
27 int l=strlen(s);
28 for(int i=1;i<=l;i++)
29 b[i]=b[i-1]+((a[s[i-1]-'a']-'0'+1)%2);
30 for(int i=1;i<=l;i++)
31 {
32 ll temp=0;
33 for(int j=i;j<=l;j++)
34 {
35 if(b[j]-b[i-1]<=k)
36 {
37 temp=temp*mod+s[j-1];
38 if(m.find(temp)==m.end())
39 {
40 sum++;
41 m[temp]=1;
42 }
43 }
44 else break;
45 }
46 }
47 printf("%lld\n",sum);
48 return 0;
49 }

NO.2 hash+数组
把字串hash的数值放到数组里面,然后先排序,用unique查重。时间复杂度低了很多了,内存也好了一半。
1 #include <iostream>
2 #include <cstdio>
3 #include <queue>
4 #include <algorithm>
5 #include <stack>
6 #include <cmath>
7 #include <map>
8 #include <cstring>
9 using namespace std;
10 #define mod 1000000007
11 #define PI acos(-1.0)
12 typedef long long ll;
13 //const int INF=0x3f3f3f3f;
14 //const ll INF=1000000000000000000;
15 //priority_queue<int, vector<int>, greater<int> >p;
16 ll ha[2250005];
17 int main()
18 {
19 map<string,int>m;
20 char s[2000];
21 char a[30];
22 ll k,sum=0;
23 scanf("%s",s);
24 scanf("%s",a);
25 scanf("%lld",&k);
26 int b[2000]={0};
27 int l=strlen(s);
28 for(int i=1;i<=l;i++)
29 b[i]=b[i-1]+((a[s[i-1]-'a']-'0'+1)%2);
30 ll next=0;
31 for(int i=1;i<=l;i++)
32 {
33 ll temp=0;
34 for(int j=i;j<=l;j++)
35 {
36 if(b[j]-b[i-1]>k)break;
37 temp=temp*mod+s[j-1];
38 ha[next++]=temp;
39 }
40 }
41 sort(ha,ha+next);
42 sum=unique(ha,ha+next)-ha;
43 printf("%lld\n",sum);
44 return 0;
45 }
NO.3 hash+set
set直接把重复的数去掉了。。。
1 #include <iostream>
2 #include <cstdio>
3 #include <queue>
4 #include <algorithm>
5 #include <stack>
6 #include <cmath>
7 #include <map>
8 #include <cstring>
9 #include <bits/stdc++.h>
10 using namespace std;
11 #define mod 1000000007
12 #define PI acos(-1.0)
13 typedef long long ll;
14 //const int INF=0x3f3f3f3f;
15 //const ll INF=1000000000000000000;
16 int main()
17 {
18 set<ll>m;
19 char s[2000];
20 char a[30];
21 ll k,sum=0;
22 scanf("%s",s);
23 scanf("%s",a);
24 scanf("%lld",&k);
25 int b[2000]={0};
26 int l=strlen(s);
27 for(int i=1;i<=l;i++)
28 b[i]=b[i-1]+((a[s[i-1]-'a']-'0'+1)%2);
29 for(int i=1;i<=l;i++)
30 {
31 ll temp=0;
32 for(int j=i;j<=l;j++)
33 {
34 if(b[j]-b[i-1]<=k)
35 {
36 temp=temp*mod+s[j-1];
37 m.insert(temp);
38 }
39 else break;
40 }
41 }
42 sum=m.size();
43 printf("%lld\n",sum);
44 return 0;
45 }
NO.4 hash+字典树
懒得写了,实现起来原理都是一样的。
好了,这个题就讲到这里,我去看下哪个队需要喊666的队友。
codeforces #271D Good Substrings的更多相关文章
- Codeforces 271D - Good Substrings [字典树]
传送门 D. Good Substrings time limit per test 2 seconds memory limit per test 512 megabytes input stand ...
- Good Substrings CodeForces - 271D
You've got string s, consisting of small English letters. Some of the English letters are good, the ...
- 【CodeForces 271D】Good Substrings
[链接] 我是链接,点我呀:) [题意] [题解] 字典树 我们可以两重循环(i,j) 来枚举所有的子串 即i=1,j=1,2,3... i=2,j = 2,3,4,.. 于是我们在i变化的时候(就是 ...
- Codeforces 316G3 Good Substrings 字符串 SAM
原文链接http://www.cnblogs.com/zhouzhendong/p/9010851.html 题目传送门 - Codeforces 316G3 题意 给定一个母串$s$,问母串$s$有 ...
- CodeForces 550A Two Substrings(模拟)
[题目链接]click here~~ [题目大意]: You are given string s. Your task is to determine if the given string s ...
- Codeforces 1276F - Asterisk Substrings(SAM+线段树合并+虚树)
Codeforces 题面传送门 & 洛谷题面传送门 SAM hot tea %%%%%%% 首先我们显然可以将所有能够得到的字符串分成六类:\(\varnothing,\text{*},s, ...
- Codeforces.392E.Deleting Substrings(区间DP)
题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...
- CodeForces 1110H. Modest Substrings
题目简述:给定$1 \leq l \leq r \leq 10^{800}$,求一个长度为$n \leq 2000$的数字串$s$,其含有最多的[好]子串.一个串$s$是[好]的,如果将其看做数字时无 ...
- @codeforces - 1276F@ Asterisk Substrings
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个包含 n 个小写字母的字符串 s,用 s 生成 n 个串 ...
随机推荐
- Linux实战(14):Ubuntu修改root默认登陆
第一步 首先登录系统,创建root用户的密码 在终端输入命令: sudo passwd root 然后输入设置的密码,这样就完成了设置root用户密码的步骤 第二步 修改文件 sudo nano /u ...
- MySQL索引的基本操作
常见的索引类型 PROMARY KEY 主键索引,也是唯一索引,不允许重复数据. UNIQUE INDEX唯一索引,不允许有重复数据. INDEX 普通索引允许有重复数据. 组合索引,对多个字段添加索 ...
- 5.Topic与Partition
- 龙芯3A4000-Debian 10上常用软件记录
所用平台 硬件:龙芯3a4000 (MIPS64el) 操作系统:Debian 10(buster)+ MATE桌面 内核版本:4.19.90 以下所有软件同样适用于x86体系结构的Linux发行版. ...
- Redis5设计与源码分析读后感(三)跳跃表
一.引言 有序集合在日常开发中相当常见,比如做排名等相关的功能,肯定要用到排序的功能,那么常见底层实现有很多种: 数组 :不便于元素的插入和删除 链表 :查询效率低,需要遍历所有元素 平衡树OR红黑树 ...
- 刷题[GXYCTF2019]禁止套娃
梳理思路 打开网站,发现很简单,只有flag在哪里的字样. 查看源码,常用后台目录,robots.txt,都未发现有任何东西. 扫描 直接拉进扫描器一扫,发现 思考可能是git源码泄露,可能可以恢复源 ...
- python类,魔术方法等学习&&部分ssti常见操作知识点复习加深
python类学习&&部分ssti常见操作知识点复习加深 在做ssti的模块注入的时候经常觉得自己python基础的薄弱,来学习一下,其实还是要多练习多背. 在python中所有类默认 ...
- 提权 EXP
windows: 漏洞列表 #Security Bulletin #KB #Description #Operating System CVE-2017-0213 [Windows COM Eleva ...
- 带你搭建一个简单的mybatis项目:IDEA+spring+springMVC+mybatis+Mysql
最近小编有点闲,突发奇想想重温一下mybatis,然后在脑海中搜索了一下,纳尼,居然不太会用了,想到这里都是泪啊!!现在我所呆的的公司使用的是springboot+hebinate,编程都是使用的JP ...
- spring cloud consul 服务治理
对照系统安装响应consul文件(以window为例) 解压文件之后配置环境,进入Path添加文件所在目录, 测试:在文件所在目录下进入指令操作 输入 consul agent -dev 启动成功,在 ...