Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3.  
  4. const int maxN = 1e6 + 10;
  5. const int inf = 1e9;
  6.  
  7. int cur_len, str_len;
  8. int cnt = 1, cur, pos;
  9. int to[maxN][26], len[maxN], first_pos[maxN], link[maxN];
  10. int dist[maxN], max_len[maxN][2];
  11. bool leaf[maxN];
  12. std::string str;
  13.  
  14. int make (int _pos, int _len) {
  15. len[cnt] = _len;
  16. first_pos[cnt] = _pos;
  17. return cnt++;
  18. }
  19.  
  20. void add (int sym) {
  21. cur_len++;
  22. pos++;
  23. int last = 0;
  24. while (pos) {
  25. while (pos > len[to[cur][str[cur_len - pos] - 'a']]) {
  26. cur = to[cur][str[cur_len - pos] - 'a'];
  27. pos -= len[cur];
  28. }
  29. int& vtx = to[cur][str[cur_len - pos] - 'a'];
  30. if (!vtx) {
  31. vtx = make(cur_len - pos, inf);
  32. link[last] = cur;
  33. last = 0;
  34. leaf[vtx] = 1;
  35. } else {
  36. int tmp = str[first_pos[vtx] + pos - 1] - 'a';
  37. if (tmp == sym) {
  38. link[last] = cur;
  39. return;
  40. }
  41. int new_vtx = make(first_pos[vtx], pos - 1);
  42. to[new_vtx][sym] = make(cur_len - 1, inf);
  43. leaf[to[new_vtx][sym]] = 1;
  44. to[new_vtx][tmp] = vtx;
  45. first_pos[vtx] += pos - 1;
  46. len[vtx] -= pos - 1;
  47. vtx = new_vtx;
  48. link[last] = new_vtx;
  49. last = new_vtx;
  50. }
  51. if (cur) {
  52. cur = link[cur];
  53. } else {
  54. pos--;
  55. }
  56. }
  57. }
  58. void dfs (int vtx) {
  59. if (leaf[vtx]) {
  60. max_len[vtx][0] = dist[vtx];
  61. }
  62. for (int i = 0; i < 26; i++) {
  63. if (to[vtx][i]) {
  64. int nxt = to[vtx][i];
  65. dist[nxt] = dist[vtx] + std::min (str_len - first_pos[nxt], len[nxt]);
  66. dfs(nxt);
  67. if (max_len[nxt][0] > max_len[vtx][0]) {
  68. max_len[vtx][1] = std::max (max_len[vtx][0], max_len[nxt][1]);
  69. max_len[vtx][0] = max_len[nxt][0];
  70. } else {
  71. max_len[vtx][1] = std::max (max_len[vtx][1], max_len[nxt][0]);
  72. }
  73. }
  74. }
  75. }
  76.  
  77. int main() {
  78. len[0] = inf;
  79. std::cin >> str_len >> str;
  80. for (auto sym : str) {
  81. add(sym - 'a');
  82. }
  83. int64_t ans = 0;
  84. dfs(0);
  85. for (int i = 1; i < cnt; i++) {
  86. int64_t length = std::min (len[i], str_len - first_pos[i]);
  87. ans += length * (length - 1) / 2;
  88. if (!leaf[i]) {
  89. ans += length * (max_len[i][1] ? max_len[i][0] - max_len[i][1] : 1);
  90. }
  91. }
  92. std::cout << ans;
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement