关于此题输入
查看原帖
关于此题输入
149219
_maze楼主2022/11/8 17:33

不知道为什么,我的一直只有三十分,把输入下下来也是对的,系统也是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;
}
2022/11/8 17:33
加载中...