Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define TASK "count"
- const int ALPHA = 256;
- const int MAXN = 2000000;
- const int INF = (int) 1e9;
- int tid;
- struct node
- {
- int go[ALPHA];
- int link;
- int pos, len;
- node() {}
- node(int pos, int len = INF)
- : link(0)
- , pos(pos)
- , len(len)
- {
- memset(go, 0, sizeof go);
- }
- } t[MAXN];
- int make_node(int pos, int len = INF)
- {
- t[tid] = node(pos, len);
- return tid++;
- }
- int s[MAXN];
- int n;
- int cur, pos;
- void ukkadd(int c)
- {
- s[n++] = c;
- ++pos;
- int last = 0;
- while (pos > 0) {
- while (t[t[cur].go[s[n - pos]]].len < pos) {
- cur = t[cur].go[s[n - pos]];
- pos -= t[cur].len;
- }
- int& next = t[cur].go[s[n - pos]];
- int end_char = s[t[next].pos + pos - 1];
- if (next == 0) {
- next = make_node(n - pos);
- t[last].link = cur;
- last = 0;
- } else if (c == end_char) {
- t[last].link = cur;
- return;
- } else {
- int u = make_node(t[next].pos, pos - 1);
- t[u].go[c] = make_node(n - 1);
- t[u].go[end_char] = next;
- t[next].pos += pos - 1;
- t[next].len -= pos - 1;
- next = u;
- t[last].link = u;
- last = u;
- }
- if (cur == 0) {
- --pos;
- } else {
- cur = t[cur].link;
- }
- }
- }
- int main()
- {
- freopen(TASK ".in", "r", stdin);
- freopen(TASK ".out", "w", stdout);
- ios_base::sync_with_stdio(false);
- t[0].len = INF;
- tid = 1;
- string s;
- cin >> s;
- for (int i = 0; i < (int) s.size(); i++) {
- ukkadd((int) s[i]);
- }
- long long ans = 0;
- for (int i = 1; i < tid; i++) {
- ans += min(n - t[i].pos, t[i].len);
- }
- cout << ans << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement