Advertisement
cincout

Количество конкатенаций палиндромов

Mar 14th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. namespace hash_use {
  6. const int H_MAXN = 1e6 + 5;
  7. const int p = 239017;
  8. int deg[H_MAXN], sum[H_MAXN];
  9. const int mod = 1e9 + 13;
  10. void init_hash() {
  11. deg[0] = 1;
  12. sum[0] = 1;
  13. for (int i = 1; i < H_MAXN; ++i) {
  14. deg[i] = (deg[i - 1] * p) % mod;
  15. sum[i] = deg[i];
  16. sum[i] += sum[i - 1];
  17. sum[i] %= mod;
  18. }
  19. }
  20. vector <int> getHash(string s) {
  21. vector <int> h(s.size());
  22. h[0] = s[0];
  23. for (int i = 1; i < s.size(); ++i) {
  24. h[i] = ((h[i - 1] * p) % mod + (s[i])) % mod;
  25. }
  26. return h;
  27. }
  28. int getHashSegment(vector <int> &hash, int l, int r) { // [0..n-1]
  29. int bn = ((l == 0) ? 0 : hash[l - 1]);
  30. int ret = (hash[r] + mod - ((bn * deg[r - l + 1]) % mod)) % mod;
  31. return ret;
  32. }
  33. int addHash(int hash1, int hash2, int sizehash2) {
  34. int ret = ((hash1 * deg[sizehash2] % mod) + hash2) % mod;
  35. return ret;
  36. }
  37. }
  38.  
  39. vector<int> prefix_function(string s) {
  40. int n = (int)s.length();
  41. vector<int> pi(n);
  42. for (int i = 1; i<n; ++i) {
  43. int j = pi[i - 1];
  44. while (j > 0 && s[i] != s[j])
  45. j = pi[j - 1];
  46. if (s[i] == s[j]) ++j;
  47. pi[i] = j;
  48. }
  49. return pi;
  50. }
  51.  
  52. using namespace hash_use;
  53.  
  54. string getT(string a) {
  55. auto get = prefix_function(a);
  56. int may_be = a.size() - get.back();
  57. bool is = 1;
  58. if ((a.size()) % may_be) is = 0;
  59. for (int i = 0; i < a.size(); ++i) {
  60. if (i - may_be >= 0) {
  61. if (a[i] != a[i - may_be]) {
  62. is = 0;
  63. }
  64. }
  65. }
  66. if (is) {
  67. return a.substr(0, may_be);
  68. }
  69. else {
  70. return a;
  71. }
  72. }
  73.  
  74. void solve() {
  75. int n;
  76. cin >> n;
  77. map <string, int> T;
  78. int ans = 0;
  79. for (int i = 0; i < n; ++i) {
  80. string s;
  81. cin >> s >> s;
  82. auto fx = getT(s);
  83. T[fx]++;
  84. }
  85. for (auto i : T) {
  86. ans += i.second * i.second;
  87. }
  88. cout << ans;
  89. }
  90.  
  91. signed main() {
  92. ios::sync_with_stdio(false);
  93. cin.tie(0);
  94. solve();
  95. return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement