萌新求助, 为什么此题一直CE???
查看原帖
萌新求助, 为什么此题一直CE???
139012
wrpwrp楼主2020/7/23 10:33
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define R register
const int inf = 0x3f3f3f3f;
const int N = 5e5 + 10;

inline int read() {
	char a = getchar(); int x = 0,f = 1;
	for(; a>'9' ||  a<'0'; a = getchar()) if(a == '-') f = -1;
	for(;a >= '0' && a <= '9'; a = getchar()) x = x * 10 + a - '0';
	return x * f;
}

int n;
char s[N];
int ch[N][26], fa[N], len[N], siz[N];
int las = 1, node = 1;
inline void ins(int c) {
	int now = las, p = ++ node; las = p;
	len[p] = len[now] + 1; siz[p] = 1;
	while(now && ! ch[now][c]) ch[now][c] = p, now = fa[now];
	if(!now) { fa[p] = 1; return ; }
	int x = ch[now][c];
	if(len[now] + 1 == len[x]) { fa[p] = x; return; }
	int y = ++ node; len[y] = len[now] + 1; fa[y] = fa[x]; fa[x] = fa[p] = y;
	memcpy(ch[y], ch[x], sizeof(ch[y]));
	while(now && ch[now][c] == x) ch[now][c] = y, now = fa[now];
}

struct edge { int to, next; } e[N << 1]; int head[N], cnt;
inline void add(int x, int y) { e[ ++ cnt] = { y, head[x] }; head[x] = cnt ; }

inline void dfs(int x) {
	for(R int i = head[x]; i ; i = e[i].next ) {
		int y = e[i].to; dfs(y);
		siz[x] += siz[y];
	}
}

int mx[N << 2];
inline int ls(int x) { return x << 1; }
inline int rs(int x) { return x << 1 | 1; }
inline void pushdown(int x) {
	mx[ls(x)] = max(mx[ls(x)], mx[x]);
	mx[rs(x)] = max(mx[rs(x)], mx[x]);
}
inline void update(int x, int l, int r, int LL, int RR, int k) {
	//printf("%d %d\n", LL, RR);
	if(LL <= l && r <= RR) { mx[x] = max(mx[x], k); return ;}
	pushdown(x);
	int mid = (l + r) >> 1;
	if( LL <= mid) update(ls(x), l, mid, LL, RR, k);
	if(RR > mid) update(rs(x), mid + 1, r , LL, RR, k);
}
inline int ask(int x, int l, int r, int ad) {
	if(l == r) return mx[x];
	pushdown(x);
	int mid = (l + r) >> 1;
	if(ad <= mid) return ask(ls(x), l, mid, ad);
	else return ask(rs(x), mid + 1, r, ad);
	return -1;
}

int main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%s", s + 1); n = strlen(s + 1);
	for(R int i = 1; i <= n; i ++) ins(s[i] - 'a');
	for(R int i = 2; i <= node; i ++) add(fa[i], i);
	dfs(1);
//	for(R int i = 1; i <= node; i ++) printf("%d ", len[i]);
	for(R int i = 2; i <= node; i ++) {
		update(1, 1, n, len[fa[i]] + 1, len[i], siz[i]);
	}
	for(R int i = 1; i <= n; i ++)
		printf("%d\n", ask(1, 1, n, i));
	return 0;	
}
2020/7/23 10:33
加载中...