Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const int N = 100005;
- const int base = 311;
- const int mod = 1e9 + 7;
- int p[N], l[N], r[N];
- int f[N];
- int getl(int u, int k) {
- return (l[u] - l[u - k] * p[k] + mod * mod) % mod;
- }
- int getr(int u, int k) {
- return (r[u] - r[u + k] * p[k] + mod * mod) % mod;
- }
- signed main() {
- int n; cin >> n;
- string t; cin >> t;
- string s = "@#";
- for (size_t i = 0; i < t.size(); i++) {
- s += t[i]; s += '#';
- }
- s += '$';
- n = s.size();
- p[0] = 1;
- for (int i = 1; i < n; i++) {
- p[i] = (p[i - 1] * base) % mod;
- }
- l[0] = s[0] - 'a' + 1;
- for (int i = 1; i < n; i++) {
- l[i] = (l[i - 1] * base + s[i] - 'a' + 1) % mod;
- }
- r[n - 1] = s[n - 1] - 'a' + 1;
- for (int i = n - 2; i >= 0; i--) {
- r[i] = (r[i + 1] * base + s[i] - 'a' + 1) % mod;
- }
- int ans = 1;
- for (int i = 1; i < n - 1; i++) {
- int l = 1, r = min(i, n - i - 1);
- while (l <= r) {
- int m = (l + r) / 2;
- if (getl(i, m) == getr(i, m)) {
- f[i] = m;
- l = m + 1;
- }
- else r = m - 1;
- }
- ans = max(ans, f[i]);
- }
- cout << ans << '\n';
- for (size_t i = 0; i < s.size(); i++) cout << setw(3) << i; cout << '\n';
- for (size_t i = 0; i < s.size(); i++) cout << setw(3) << s[i]; cout << '\n';
- for (size_t i = 0; i < s.size(); i++) cout << setw(3) << f[i]; cout << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement