D. Good Substrings
time limit per test
2 seconds
memory limit per test
512 megabytes
input
standard input
output
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].
Input
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.
Output
Print a single integer — the number of distinct good substrings of string s.
Examples
input
Copy
ababab 01000000000000000000000000 1
output
Copy
5
input
Copy
acbacbacaa 00000000000000000000000000 2
output
Copy
8
Note
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".
题意:输入的第一个串里面有些字符是好字符,有些是坏字符,输入的第二个串是01串,长度是26个,代表对应的26个字母,如果对应的字母是1的话,那么这个字符是好字符,反之是坏字符,输入的一个整数k,在第一个字符串中找不同的子串,子串的要求是包含的坏字符不能超过k个,问这样的子串有多少个。
解题思路: 先求一个关于坏字符的前缀和,根据前缀和去判断所要求的子串是否符合要求,符合要求的子串算出其hash值存到vector中,最后对vector去重即可得到答案。
/*
@Author: Top_Spirit
@Language: C++
*/
#include <bits/stdc++.h>
using namespace std ;
typedef unsigned long long ull ;
typedef long long ll ;
const int Maxn = 2e3 +10 ;
const int INF = 0x3f3f3f3f ;
const double PI = acos(-1.0) ;
const ull seed = 133;
const ull MOD = 1e9 + 7 ;
string s ,str ;
vector < ull > ve ;
int k, len ;
int pre_sum[Maxn] ;
int main (){
cin >> s >> str >> k ;
len = s.size() ;
pre_sum[0] = 0 ;
for (int i = 1; i <= len; i++){
pre_sum[i] = pre_sum[i - 1] + (str[s[i - 1] - 'a'] == '0') ;
}
for (int i = 1; i <= len; i++){
ull _Hash = 0 ;
for (int j = i; j <= len; j++){
if (pre_sum[j] - pre_sum[i - 1] > k) break ;
_Hash = _Hash * seed + s[j - 1];
ve.push_back(_Hash) ;
}
}
sort(ve.begin(), ve.end()) ;
int ans = unique(ve.begin(), ve.end()) - ve.begin() ;
cout << ans << endl ;
return 0 ;
}
向往自然
更享于自我