Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define long ll
- #define all(x) begin(x), end(x)
- const int N = 1e6;
- const int P = 257;
- const int H = 2;
- const uint64_t M[H] = {(uint64_t)1e9 + 21, (uint64_t)1e9 + 33};
- uint64_t p_pow[H][N];
- struct Initialization {
- Initialization() {
- for (int k = 0; k < H; ++k) {
- p_pow[k][0] = 1;
- for (int i = 1; i < N; ++i) {
- p_pow[k][i] = (p_pow[k][i - 1] * P) % M[k];
- }
- }
- }
- } init;
- struct Forward_Multiple_Hash {
- int n;
- string s;
- vector<uint64_t> h[H];
- Forward_Multiple_Hash(const string &from) :
- n((int)from.size()),
- s(from) {
- for (int k = 0; k < H; ++k) {
- h[k] = {0};
- h[k].reserve(n + 1);
- for (char c : s) {
- h[k].push_back((h[k].back() * P + c) % M[k]);
- }
- }
- }
- long operator()(int l, int r) {
- //assert(0 <= l && l <= r && r <= n - 1);
- static uint64_t a[H];
- for (int k = 0; k < H; ++k) {
- a[k] = (h[k][r + 1] + (M[k] << 32) - h[k][l] * p_pow[k][r - l + 1]) % M[k];
- }
- return (a[0] << 32) + a[1];
- }
- };
- struct Backward_Multiple_Hash {
- int n;
- string s;
- vector<uint64_t> h[H];
- Backward_Multiple_Hash(const string &from) :
- n((int)from.size()),
- s(from) {
- reverse(all(s));
- for (int k = 0; k < H; ++k) {
- h[k] = {0};
- h[k].reserve(n + 1);
- for (char c : s) {
- h[k].push_back((h[k].back() * P + c) % M[k]);
- }
- }
- }
- long operator()(int revl, int revr) {
- //assert(0 <= revl && revl <= revr && revr <= n - 1);
- int l = n - 1 - revr, r = n - 1 - revl;
- //assert(0 <= l && l <= r && r <= n - 1);
- static uint64_t a[H];
- for (int k = 0; k < H; ++k) {
- a[k] = (h[k][r + 1] + (M[k] << 32) - h[k][l] * p_pow[k][r - l + 1]) % M[k];
- }
- return (a[0] << 32) + a[1];
- }
- };
- int main() {
- #ifdef LC
- assert(freopen("input.txt", "r", stdin));
- #endif
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- string s;
- cin >> s;
- Forward_Multiple_Hash fw(s);
- int n = (int)s.size();
- const int S = 50e6;
- static long hs[S];
- size_t ptr = 0;
- for (int i = 0; i < n; ++i) {
- for (int j = i; j < n; ++j) {
- hs[ptr++] = fw(i, j);
- }
- }
- cout << clock() * 1000 / CLOCKS_PER_SEC << endl;
- sort(hs, hs + ptr);
- ptr = unique(hs, hs + ptr) - hs;
- cout << ptr << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement