不知道为什么,我的一直只有三十分,把输入下下来也是对的,系统也是ubuntu,但洛谷就是测不出来。。。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 1e5 + 5;
int hw[maxn << 1], n, b[maxn << 1];
string s;
void change(string S)
{
s[0] = s[1] = '$';
for(int i = 0;i < n;i ++)
{
s[i * 2 + 2] = S[i];
s[i * 2 + 3] = '$';
}
n = n * 2 + 2;
s[n] = 0;
}
void maracher()
{
int maxr = 0,mid = 114514;
for(int i = 1;i < n;i++)
{
if(i < maxr) hw[i] = min(hw[(mid << 1) - i],hw[mid] + mid - i);
else hw[i] = 1;
// cout << i << ' ' << hw[i] << ' ' << s[i + hw[i]] << ' ' << s[i - hw[i]] << endl;
// cout << mid << endl;
for(;s[i + hw[i]] == s[i - hw[i]];++ hw[i]) ;
// cout << endl;
if(hw[i] + i > maxr)
{
maxr = hw[i] + i;
mid = i;
}
// cout << hw[i] << endl;
}
// for(int i = 1;i < n;i ++) cout << hw[i] << ' ';
// cout << endl;
}
bool ton[maxn << 1];
struct linetree
{
int tr[maxn << 3];
#define ls(u) u<<1
#define rs(u) (u<<1)+1
void push_up(int u){ tr[u] = max(tr[ls(u)], tr[rs(u)]); }
void change(int p, int l, int r, int fl, int k)
{
// cout << p << endl;
if(l > fl || r < fl) return ;
if(l == r)
{
tr[p] = k;
return ;
}
int mid = l + r >> 1;
change(ls(p), l, mid, fl, k);
change(rs(p), mid + 1, r, fl, k);
push_up(p);
}
int query(int p, int l, int r, int fl, int fr)
{
if(l >= fl && r <= fr)
{
// cout << fl << ' ' << fr << ' ' << p << ' ' << tr[p] << endl;
return tr[p];
}
if(l > fr || r < fl) return 0;
int mid = l + r >> 1, ans = 0;
ans = max(ans, query(ls(p), l, mid, fl, fr));
ans = max(ans, query(rs(p), mid + 1, r, fl, fr));
return ans;
}
}T;
char S[maxn];
signed main()
{
freopen("text.in", "r", stdin);
scanf("%s", S);
n = strlen(S);
int p = n;
change(S);
maracher();
int ans = 0;
for(int i = n - 1;i > 0;i --)
{
hw[i] --;
int j = T.query(1, 1, n, 1, i + hw[i]);
if(j != 0) ans = max(ans, (j - i));
if(ton[i - hw[i]] == 0)
{
ton[i - hw[i]] = 1;
T.change(1, 1, n, i - hw[i], i);
}
}
if(ans == p) cout << ans - 1 << endl;
else cout << ans << endl;
return 0;
}