Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_DEPRECATE
- #define _USE_MATH_DEFINES
- #include <cstdio>
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <deque>
- #include <stack>
- #include <algorithm>
- #include <cmath>
- #include <map>
- #include <set>
- #include <ctime>
- #include <sstream>
- #include <numeric>
- #define sz(x) (int)(x).size()
- #define all(x) (x).begin(),(x).end()
- #define EPS 1e-9
- #define INF INT_MAX
- #define SQR(X) (X) * (X)
- #define round(x) (int)floor((x) + 0.5 + EPS)
- using namespace std;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair <int, int> pii;
- typedef vector <int> vi;
- typedef vector <vi> vvi;
- typedef vector <pii> vpii;
- typedef vector <vpii> vvpii;
- typedef vector <string> vs;
- typedef vector <uint> vu;
- typedef vector <ull> vull;
- const int N = 1005;
- const int P = 41;
- bool Find(ull x, vull &v, int l, int r) // Бинпоиск, показывает, есть ли элемент x в векторе v
- {
- if (l == r) return x == v[l];
- int m = (l + r) / 2;
- return (x <= v[m]) ? Find(x, v, l, m) : Find(x, v, m + 1, r);
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("hashes.in", "r", stdin);
- freopen("hashes.out", "w", stdout);
- #endif
- char buf[N]; //Входная строка
- vull h[3]; //Массив хэшей
- vull Pows(N); //Степени P
- Pows[0] = 1;
- for (int i = 1; i < N; i++)
- Pows[i] = Pows[i - 1] * P;
- for (int i = 0; i < 3; i++)
- {
- scanf("%s", buf);
- int n = (int)strlen(buf);
- h[i].resize(n);
- h[i][0] = (buf[0] - 'a' + 1);
- for (int j = 1; j < n; j++) //Считаем хэши от всех префиксов
- h[i][j] = h[i][j - 1] + (buf[j] - 'a' + 1) * Pows[j];
- for (int j = 1; j < n; j++)
- for (int k = j; k < n; k++)
- {
- ull cur_h = h[i][k] - h[i][j - 1];
- cur_h *= Pows[N - 1 - j]; //Приводим хэши к степени P[N - 1]
- h[i].push_back(cur_h);
- }
- for (int j = 0; j < n; j++) //Приводим хэши префиксов к этой же степени
- h[i][j] *= Pows[N - 1 - j];
- sort(all(h[i]));
- }
- int ans = 0;
- for (int i = 0; i < sz(h[2]); i++)
- {
- if (i && h[2][i] == h[2][i - 1]) continue; // Если хэш уже искали - продолжить
- //Найден в обоих массивах - увеличим ответ на 1
- if (Find(h[2][i], h[1], 0, sz(h[1]) - 1) && Find(h[2][i], h[0], 0, sz(h[0]) - 1)) ans++;
- }
- printf("%d", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement