Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <string>
- #include <cstring>
- #include <ctime>
- #include <queue>
- #include <set>
- #include <map>
- using namespace std;
- char c;
- int n, z[2000][2000], l, r, d[2000], ans, s[2000], ok[50], cur, qq;
- int main() {
- c = getchar();
- while(c != '\n') {
- s[n++] = c - 'a' + 1;
- c = getchar();
- }
- for (int i = 1; i <= 26; i++) {
- c = getchar();
- ok[i] = c - '0';
- }
- cin >> qq;
- for (int k = 1; k < n; k++) {
- l = k - 1, r = -1;
- for (int i = k; i < n; ++i) {
- if (i <= r)
- z[k][i] = min(r - i + 1, z[k][k + i - l - 1]);
- while(i + z[k][i] < n && s[k + z[k][i] - 1] == s[i + z[k][i]])
- ++z[k][i];
- if (i + z[k][i] - 1 > r)
- l = i, r = i + z[k][i] - 1;
- }
- }
- for (int i = 1; i < n; i++)
- for (int j = i - 1; j < n; j++)
- d[j] = max(d[j], z[i][j]);
- for (int i = 0; i < n; i++) {
- cur = 0;
- for (int j = i; j < n; j++) {
- cur += 1 - ok[s[j]];
- if (cur > qq)
- break;
- if (j >= i + d[i])
- ans++;
- }
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement