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 个串 ...
随机推荐
- SpringBoot 配置的加载
SpringBoot 配置的加载 SpringBoot配置及环境变量的加载提供许多便利的方式,接下来一起来学习一下吧! 本章内容的源码按实战过程采用小步提交,可以按提交的节点一步一步来学习,仓库地址: ...
- kubernetes部署Percona XtraDB Cluster集群
PXC介绍 全称percona-xtradb-cluster,提供了MySQL高可用的一种实现方法.PXC集群以节点组成(推荐至少3节点,便于故障恢复),每个节点都是基于常规的 MySQL Serve ...
- linux循环定时任务
crond定时任务 centos # 重启服务 service crond restart ----------------------------------------- chkconfig cr ...
- Centos-浏览大文件-more less
more less 浏览一个大文件,一屏无法显示完毕,通过这两个命令分屏读取文件内容 more 相关选项 -d 底部显示友好提示,如退出按键提示,继续浏览按键提示 -s 将多个空行减少为只有一个空行 ...
- Python-在列表、字典中筛选数据
实际问题有哪些? 过滤掉列表[3,9,-1,10.-2......] 中负数 筛选出字典{'li_ming':90,'xiao_hong':60,'li_kang':95,'bei_men':98} ...
- JS进阶系列-JS执行期上下文(一)
❝ 点赞再看,年薪百万 本文已收录至https://github.com/likekk/-Blog欢迎大家star,共同进步.如果文章有出现错误的地方,欢迎大家指出.后期将在将GitHub上规划前端学 ...
- IP基础知识
请根据IP地址 和 子网掩码,计算出 网络地址.广播地址 IP地址分类 对3类主要IP地址的补充说明:
- C#编写一个较完整的记事本程序
开发环境 Visual Studio 2019 至少需安装 .NET桌面开发 创建项目并配置 创建窗体文件 配置项目名称及框架 设计界面 创建窗体文件,将控件摆放位置如下,参考系统自带的记事本程序 窗 ...
- 【随笔】Apache降权和禁用PHP危险函数
测试环境: Windows Server 2003 + phpstudy 首先在win2003里运行phpstudy,这里注意需要选择应用系统服务模式,应用之后重启phpstudy. 打开系统服务(开 ...
- C++中try&catch
参考: https://blog.csdn.net/xueluowutong/article/details/81257654 在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在 ...