假做法能过
查看原帖
假做法能过
484006
sqrtDataStructure楼主2024/1/12 19:45
#include <bits/stdc++.h>
using namespace std;
#define _rep(i_,a_,b_) for(int i_ = (a_); i_ <= (b_); ++i_)
#define mid ((L+R) >> 1)
#define multiCase() int testCnt = in(); _rep(curCase,1,testCnt)
#ifdef ONLINE_JUDGE
#define debug(...) 0
#else
#define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
#endif
using ll = long long;
using pii = pair<int,int>;

int in(void) { int x; scanf("%d", &x); return x; } ll inl(void) { ll x; scanf("%lld", &x); return x; }
void out(int x) { printf("%d ", x); } void outln(int x) { printf("%d\n", x); }
void out(ll x) { printf("%lld ", x); } void outln(ll x) { printf("%lld\n", x); }
template<typename T> void chkmax(T &a, const T &b) { a = max(a, b); } 
template<typename T> void chkmin(T &a, const T &b) { a = min(a, b); } 
const int kN = 305000;
int a[kN], sigm, n; char s[kN];
int cnt[kN], x[kN], y[kN], sa[kN]; //, rk[kN];
void SA(void) {
	int m = n + 5;
	_rep(i,1,n) ++cnt[x[i] = a[i]];
	_rep(i,1,m) cnt[i] += cnt[i - 1];
	_rep(i,1,n) sa[cnt[x[i]]--] = i;
	for(int k = 1; k <= n; k <<= 1) {
		int top = 0;
		_rep(i,n - k + 1,n) y[++top] = i;
		_rep(i,1,n) if(sa[i] > k) y[++top] = sa[i] - k;
		memset(cnt, 0, sizeof(cnt));
		_rep(i,1,n) ++cnt[x[i]];
		_rep(i,1,m) cnt[i] += cnt[i - 1];
		for(int i = n; i; --i) sa[cnt[x[y[i]]]--] = y[i], y[i] = 0;
		_rep(i,1,n) swap(x[i], y[i]);
		x[sa[1]] = m = 1;
		_rep(i,2,n) if(y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) x[sa[i]] = m; else x[sa[i]] = ++m; 
	}
}
const unsigned bas = 998244353; 
unsigned hsh[kN], pw[kN];
unsigned gethash(int l, int r) { return hsh[r] - hsh[l - 1] * pw[r - l + 1]; }
vector<int> ans[kN];
void update(int l, int r, int k) {
	ans[l].emplace_back(k);
	ans[r + 1].emplace_back(-k);
}
int main() { 
	sigm = in(), n = in();
	if(sigm == 26) {
		scanf("%s", s + 1);
		_rep(i,1,n) a[i] = s[i] - 'a' + 1;
	} else {
		_rep(i,1,n) a[i] = in();
	}
	vector<int> d;
	_rep(i,1,n) d.push_back(a[i]);
	sort(d.begin(), d.end()), d.erase(unique(d.begin(), d.end()), d.end());
	_rep(i,1,n) a[i] = lower_bound(d.begin(), d.end(), a[i]) - d.begin() + 1;
	a[++n] = d.size() + 1;
	SA(); --n;
	_rep(i,1,n) hsh[i] = hsh[i - 1] * bas + a[i];
	pw[0] = 1; _rep(i,1,n) pw[i] = pw[i - 1] * bas;
	update(1, n - sa[1] + 1, sa[1]);
	// debug("i = 1\n, update(1, %d, %d)\n", n - sa[1] + 1, sa[1]);
	int ctrl = n - sa[1] + 1, lst = 1;
	_rep(i,2,n) {
		debug("i = %d\n", i);
		int u = sa[i];
		if(u > sa[lst]) continue;
		update(n - sa[lst] + 2, n - u + 1, u);
		debug("update(%d, %d, %d)\n", n - sa[lst] + 2, n - u + 1, u);
		int L = 1, R = ctrl, ans = -1;
		while(L <= R) {
			if(gethash(sa[lst], sa[lst] + mid - 1) == gethash(u, u + mid - 1)) ans = mid, L = mid + 1;
			else R = mid - 1;
		}
		if(ans != -1) update(1, ans, u), debug("update(%d, %d, %d)\n", 1, ans, u);
		ctrl = ans, lst = i;
	}	
	multiset<int> f;
	_rep(i,1,n) {
		for(auto &v : ans[i]) if(v > 0) f.insert(v); else f.erase(f.find(-v));
		out(*f.begin());
	}

	return 0;
}
input:
26 18
aabazaabaazaabaaaz

output:
1 1 15 15 6 12 12 6 6 6 6 6 6 1 1 1 1 1 

望加强数据w。

2024/1/12 19:45
加载中...