Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast") // ������������ ���������, �� ��� ������
- #pragma GCC optimize("no-stack-protector") //�����
- #pragma GCC optimize("unroll-loops") // � ���� ���� ��� �� 100 �� ������ ����� � ��������� �� ��� � 100 ��� �� ������ ��������
- #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native") // ��� ����� ����� �� ��� 03 02 ��������� � ������ ������� �������� ��� ���� ������������
- #pragma GCC optimize("fast-math")
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <stack>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <set>
- #include <deque>
- #include <queue>
- #include <map>
- #include <bitset>
- #include <random>
- #include <list>
- #include <unordered_map>
- #include <unordered_set>
- #include <cassert>
- using namespace std;
- typedef long long ll;
- typedef short sh;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef string str;
- //typedef __int128 ultraint;
- #define sqrt sqrtl
- #define F first
- #define S second
- #define endl '\n'
- #define all(vc666) vc666.begin(), vc666.end()
- #define allr(vc666) vc666.rbegin(), vc666.rend()
- //#define int long long
- #define degug(x) cerr (#x) << " " << (x) << endl;
- const ll INF = 2e18;
- const ll inf = 2e9 + 3;
- const ll ONE = 1, ZERO = 0;
- const ll mod = 998244353;
- const ll m1 = 1e9 + 575179;
- const ll m2 = 1e9 + 87;
- const ll LG = 19;
- const ll k_mo = 400;
- const ll k_sqrt = 400;
- const ll p = 79;
- ld EPS = 1e-9;
- ld PI = 3.1415926535897932384;
- ld phi = (sqrt(5) + 1.0) / 2.0;
- mt19937_64 rnd(4906);
- const int N = 1e5 + 3;
- pair <ll, ll> pw[N];
- pair <ll, ll> h[N];
- pair <int, int> get_h(int l, int r) {
- return { (h[r + 1].first - (h[l].first * pw[r - l + 1].first) % m1 + m1) % m1, (h[r + 1].second - (h[l].second * pw[r - l + 1].second) % m2 + m2) % m2 };
- }
- void solve() {
- string t, s;
- cin >> t;
- ll ans;
- ll i, j, len_t = t.size(), l, r;
- vector <vector <int> > cort(N, vector <int>(0));
- vector <vector <pair <int, int> > > keys(N, vector <pair <int, int> >(0));
- vector <ll> rzl;
- rzl.reserve(sqrt(N));
- ll n, len_s, len, m;
- pair <ll, ll> hesh;
- pw[0] = { 1, 1 };
- h[0] = { 0, 0 };
- for (i = 1; i <= len_t; i++) {
- pw[i].first = (pw[i - 1].first * p) % m1;
- pw[i].second = (pw[i - 1].second * p) % m2;
- h[i].first = (h[i - 1].first * p + (t[i - 1] - 'a' + ONE)) % m1;
- h[i].second = (h[i - 1].second * p + (t[i - 1] - 'a' + ONE)) % m2;
- }
- cin >> n;
- for (i = 0; i < n; i++) {
- cin >> s;
- len_s = s.size();
- rzl.push_back(len_s);
- hesh = { 0, 0 };
- for (j = 0; j < len_s; j++) {
- hesh.first = (hesh.first * p + (s[j] - 'a' + ONE)) % m1;
- hesh.second = (hesh.second * p + (s[j] - 'a' + ONE)) % m2;
- }
- keys[len_s].push_back(hesh);
- }
- sort(all(rzl));
- rzl.resize(unique(all(rzl)) - rzl.begin());
- m = rzl.size();
- for (i = 0; i < m; i++) {
- sort(all(keys[rzl[i]]));
- cort[rzl[i]].assign(len_t + 1, 0);
- }
- for (i = 0; i < len_t; i++) {
- for (j = 0; j < m; j++) {
- len = rzl[j];
- if (i + len - 1 < len_t) {
- if (binary_search(all(keys[len]), get_h(i, i + len - 1))) {
- cort[len][i + len]++;
- }
- }
- else {
- break;
- }
- }
- }
- for (i = 0; i < m; i++) {
- for (j = 1; j <= len_t; j++) {
- cort[rzl[i]][j] += cort[rzl[i]][j - 1];
- }
- }
- cin >> n;
- while (n--) {
- ans = 0;
- cin >> l >> r;
- for (i = 0; i < m; i++) {
- len = rzl[i];
- if (len > (r - l + 1)) break;
- ans += (cort[len][r] - cort[len][l + len - 2]);
- }
- cout << ans << " ";
- }
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r ", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(0);
- cin.tie(NULL);
- cout.tie(NULL);
- int t = 1;
- //cin >> t;
- while (t--) solve();
- }
- //Deisgned by skimono
- //Клуб "Кольца(Серьги)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement