Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #define _USE_MATH_DEFINES
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <vector>
  6. #include <queue>
  7. #include <deque>
  8. #include <stack>
  9. #include <algorithm>
  10. #include <cmath>
  11. #include <map>
  12. #include <set>
  13. #include <ctime>
  14. #include <sstream>
  15. #include <numeric>
  16.  
  17. #define sz(x) (int)(x).size()
  18. #define all(x) (x).begin(),(x).end()
  19. #define EPS 1e-9
  20. #define INF INT_MAX
  21. #define SQR(X) (X) * (X)
  22. #define round(x) (int)floor((x) + 0.5 + EPS)
  23.  
  24. using namespace std;
  25.  
  26. typedef unsigned int uint;
  27. typedef unsigned long long ull;
  28.  
  29. typedef pair <int, int> pii;
  30. typedef vector <int> vi;
  31. typedef vector <vi> vvi;
  32. typedef vector <pii> vpii;
  33. typedef vector <vpii> vvpii;
  34. typedef vector <string> vs;
  35. typedef vector <uint> vu;
  36. typedef vector <ull> vull;
  37.  
  38. const int N = 1005;
  39. const int P = 41;
  40.  
  41. bool Find(ull x, vull &v, int l, int r) // Бинпоиск, показывает, есть ли элемент x в векторе v
  42. {
  43.     if (l == r) return x == v[l];
  44.     int m = (l + r) / 2;
  45.     return (x <= v[m]) ? Find(x, v, l, m) : Find(x, v, m + 1, r);
  46. }
  47.  
  48.  
  49. int main()
  50. {
  51. #ifndef ONLINE_JUDGE
  52.     freopen("hashes.in", "r", stdin);
  53.     freopen("hashes.out", "w", stdout);
  54. #endif
  55.     char buf[N];  //Входная строка
  56.     vull h[3];      //Массив хэшей
  57.     vull Pows(N);   //Степени P
  58.     Pows[0] = 1;
  59.     for (int i = 1; i < N; i++)
  60.         Pows[i] = Pows[i - 1] * P;
  61.     for (int i = 0; i < 3; i++)
  62.     {
  63.         scanf("%s", buf);
  64.         int n = (int)strlen(buf);
  65.         h[i].resize(n);
  66.         h[i][0] = (buf[0] - 'a' + 1);
  67.         for (int j = 1; j < n; j++)     //Считаем хэши от всех префиксов
  68.             h[i][j] = h[i][j - 1] + (buf[j] - 'a' + 1) * Pows[j];
  69.         for (int j = 1; j < n; j++)
  70.             for (int k = j; k < n; k++)
  71.             {
  72.                 ull cur_h = h[i][k] - h[i][j - 1];
  73.                 cur_h *= Pows[N - 1 - j];   //Приводим хэши к степени P[N - 1]
  74.                 h[i].push_back(cur_h);
  75.             }
  76.         for (int j = 0; j < n; j++)         //Приводим хэши префиксов к этой же степени
  77.             h[i][j] *= Pows[N - 1 - j];
  78.         sort(all(h[i]));
  79.     }
  80.     int ans = 0;
  81.     for (int i = 0; i < sz(h[2]); i++)
  82.     {
  83.         if (i && h[2][i] == h[2][i - 1]) continue; // Если хэш уже искали - продолжить
  84.         //Найден в обоих массивах - увеличим ответ на 1
  85.         if (Find(h[2][i], h[1], 0, sz(h[1]) - 1) && Find(h[2][i], h[0], 0, sz(h[0]) - 1)) ans++;
  86.     }
  87.     printf("%d", ans);
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement