fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int p = 31;
  12. const int MOD[2] = {(int)1e9 + 2277, (int)1e9 + 9277};
  13. const int N = 1e5 + 5;
  14.  
  15. int n, k;
  16. string s, t;
  17. int p_pow[2][N], h[2][N];
  18.  
  19. void precompute() {
  20. for (int i = 0; i <= 1; i++) {
  21. p_pow[i][0] = 1;
  22. for (int j = 1; j <= n; j++) {
  23. p_pow[i][j] = 1ll * p_pow[i][j - 1] * p % MOD[i];
  24. }
  25. }
  26.  
  27. for (int i = 0; i <= 1; i++) {
  28. h[i][0] = 0;
  29. for (int j = 1; j <= n; j++) {
  30. h[i][j] = (1ll * h[i][j - 1] * p + (s[j] - 'a' + 1)) % MOD[i];
  31. }
  32. }
  33. }
  34.  
  35. ii getHash(int l, int r) {
  36. ii ans;
  37. ans.first = (h[0][r] - 1ll * h[0][l - 1] * p_pow[0][r - l + 1] % MOD[0] + MOD[0]) % MOD[0];
  38. ans.second = (h[1][r] - 1ll * h[1][l - 1] * p_pow[1][r - l + 1] % MOD[1] + MOD[1]) % MOD[1];
  39. return ans;
  40. }
  41.  
  42. vector<ii> hs[N];
  43.  
  44. int main() {
  45. ios::sync_with_stdio(false);
  46. cin.tie(nullptr);
  47. cin >> s;
  48. cin >> t;
  49. cin >> k;
  50. n = s.size();
  51. s = ' ' + s;
  52.  
  53. precompute();
  54.  
  55. for (int l = 1; l <= n; l++) {
  56. int cnt_bad = 0;
  57. for (int r = l; r <= n; r++) {
  58. int c = s[r] - 'a';
  59. cnt_bad += (t[c] == '0');
  60. if (cnt_bad > k) break;
  61. hs[r - l + 1].push_back(getHash(l, r));
  62. }
  63. }
  64.  
  65. int ans = 0;
  66. for (int len = 1; len <= n; len++) {
  67. vector<ii>& vec = hs[len];
  68. sort(vec.begin(), vec.end());
  69. vec.resize(unique(vec.begin(), vec.end()) - vec.begin());
  70. ans += vec.size();
  71. }
  72.  
  73. cout << ans << '\n';
  74. }
Success #stdin #stdout 0.01s 7252KB
stdin
ababab
01000000000000000000000000
1
stdout
5