Untitled
unknown
plain_text
2 years ago
2.1 kB
6
Indexable
#include <iostream> #include <vector> #include <algorithm> using namespace std; const long long int MOD = 1e9+7; const int b = 47; vector<long long int> h; vector<long long int>h2; vector<long long int> pw; int sub(int a, int b) { if (a - b < 0) { return a - b + MOD; } else { return a - b; } } int add(int a, int b) { if (a + b >= MOD) { return a + b - MOD; } else { return a + b; } } long long int mul(int a, int b) { return 1ll * a * b % MOD; } void power(int n) { pw.push_back(1); for (int i=1; i <= n; i++) { pw.push_back(mul(pw[i-1], b)); } } void build_hash(string &s) { h.push_back(0); for (int i=1; i <= s.size(); i++) { h.push_back(add(mul(h[i - 1], b), (s[i - 1] - 'a' + 1))); } reverse(s.begin(), s.end()); h2.push_back(0); for (int i=1; i <= s.size(); i++) { h2.push_back(add(mul(h2[i - 1], b), (s[i - 1] - 'a' + 1))); } } int get_hash(int l, int r, bool f) { if (f) return sub(h[r], mul(h[l], pw[r - l])); if (!f) return sub(h2[r], mul(h2[l], pw[r - l])); } int main() { string s; long long l, r, mid, c = 0; cin >> s; build_hash(s); power(s.size() + 2); for (int i=1; i < s.size(); i++) { l = 0; r = min(i+1, (int)s.size() - i); while (l + 1 < r) { mid = (l + r) / 2; if (get_hash(i-mid, i+1, 1) == get_hash(s.size() - mid - i - 1, s.size() - i, 0)) { l = mid; } else { r = mid; } } c += l; } for (int i=0; i < s.size(); i++) { l = 0; r = min(i+1, (int)s.size() - i - 1) + 1; while (l + 1 < r) { mid = (l + r) / 2; if (get_hash(i - mid + 1, i + 1, 1) == get_hash(s.size() - i - 1 - mid,s.size() - i - 1, 0)) { l = mid; } else { r = mid; } } c += l; } cout << c + s.size(); return 0; }
Editor is loading...