QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#766875#9571. Border Jump 2UnrealityWA 12ms28480kbC++205.8kb2024-11-20 19:04:212024-11-20 19:04:21

Judging History

你现在查看的是最新测评结果

  • [2024-11-20 19:04:21]
  • 评测
  • 测评结果:WA
  • 用时:12ms
  • 内存:28480kb
  • [2024-11-20 19:04:21]
  • 提交

answer

#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>;
using ull = unsigned long long;
const int inf = 0x3f3f3f3f;
const ll inf64 = 0x3f3f3f3f3f3f3f3fll;
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(unsigned x) { printf("%u ", x); } void outln(unsigned x) { printf("%u\n", x); }
void out(ll x) { printf("%lld ", x); } void outln(ll x) { printf("%lld\n", x); }
void out(ull x) { printf("%llu ", x); } void outln(ull x) { printf("%llu\n", x); }
template<typename T, typename U> void chkmax(T &a, const U &b) { if(b > a) a = b; } 
template<typename T, typename U> void chkmin(T &a, const U &b) { if(b < a) a = b; } 
const int kN = 105000;
char s[kN]; int n;
int ch[kN][26], fail[kN], len[kN], slink[kN], dep[kN], nc, last, pre[kN], ans[kN];
void RESET(int x) { memset(ch[x], 0, sizeof(ch[x])), fail[x] = len[x] = slink[x] = dep[x] = ans[x] = 0; }
void init(void) {
	nc = 1, last = 0; RESET(1), RESET(0);
	len[1] = -1;
	fail[0] = fail[1] = 1;
}
int getfail(int x, int i) {
	while(s[i - len[x] - 1] != s[i]) x = fail[x];
	return x;
}
void extend(int i) {
	int y = getfail(last, i); 
	if(!ch[y][s[i] - 'a']) {
		int cur = ++nc; RESET(cur);
		len[cur] = len[y] + 2, fail[cur] = ch[getfail(fail[y], i)][s[i] - 'a'];
		if(len[cur] <= 2 * len[fail[cur]]) slink[cur] = slink[fail[cur]], dep[cur] = dep[fail[cur]] + 1;
		else slink[cur] = cur, dep[cur] = 1;
		ch[y][s[i] - 'a'] = cur;
	} last = ch[y][s[i] - 'a'];
}
namespace SAM {
	const int kM = kN << 1;
	int ch[kM][26], link[kM], len[kM], nc, last, rt[kM];
	void RESET(int x) { memset(ch[x], 0, sizeof(ch[x])), link[x] = len[x] = rt[x] = 0; } 
	int clone(int x) { return ++nc, memcpy(ch[nc], ch[x], sizeof(ch[nc])), link[nc] = link[x], rt[nc] = 0, nc; }
	void init(void) { nc = last = 0; RESET(0); link[0] = -1; }
	void extend(char c) { c -= 'a';
		int cur = ++nc; RESET(cur); len[cur] = len[last] + 1;
		while(~last && !ch[last][c]) ch[last][c] = cur, last = link[last];
		if(last == -1) link[cur] = 0;
		else {
			int p = ch[last][c]; 
			if(len[p] == len[last] + 1) link[cur] = p;
			else {
				int q = clone(p); len[q] = len[last] + 1;
				while(~last && ch[last][c] == p) ch[last][c] = q, last = link[last];
				link[cur] = link[p] = q;
			}
		}
		last = cur;
	}
	namespace SEG {
		int ch[kM * 50][2], siz[kM * 50], nc;
		void insert(int &x, int L, int R, int p) { 
			x = ++nc, ch[x][0] = ch[x][1] = siz[x] = 0; ++siz[x];
			if(L == R) return; p <= mid ? insert(ch[x][0], L, mid, p) : insert(ch[x][1], mid + 1, R, p);
		}
		int merge(int x, int y) {
			if(!x || !y || x == y) return x | y;
			int z = ++nc; 
			ch[z][0] = merge(ch[x][0], ch[y][0]), ch[z][1] = merge(ch[x][1], ch[y][1]); siz[z] = siz[ch[z][0]] + siz[ch[z][1]];
			return z;
		}
		int query(int x, int L, int R, int p) {
			if(!x || p <= L) return -1;
			if(L == R) return L;
			if(int tmp = query(ch[x][1], mid + 1, R, p); tmp != -1) return tmp;
			return query(ch[x][0], L, mid, p);
		}
	} using SEG::insert, SEG::merge, SEG::query;
	int fa[20][kN], prenode[kN];
	void init(char *s, int n) {
		init(); SEG::nc = 0; _rep(i,1,n) extend(s[i]), insert(rt[last], 1, n, i), prenode[i] = last;
		_rep(i,1,nc) fa[0][i] = link[i];
		_rep(i,1,19) _rep(j,1,n) fa[i][j] = fa[i - 1][fa[i - 1][j]];
		static int ord[kM], cnt[kM];
		_rep(i,0,nc) cnt[i] = 0;
		_rep(i,1,nc) ++cnt[len[i]];
		_rep(i,1,nc) cnt[i] += cnt[i - 1];
		_rep(i,1,nc) ord[cnt[len[i]]--] = i;
		for(int i = nc, u = ord[i]; i; --i, u = ord[i]) rt[link[u]] = merge(rt[link[u]], rt[u]); 
	}
	int locate(int l, int r) {
		int u = prenode[r];
		for(int i = 19; ~i; --i) if(len[fa[i][u]] >= r - l + 1) u = fa[i][u];
		return u;
	}
}
int ask(int l, int r) {
	return SAM::query(SAM::rt[SAM::locate(2 * n - r + 1, 2 * n - l + 1)], 1, n * 2, r);	
}
struct Info {
	int top, bot, cnt;
};
int main() { 
	multiCase() {
		scanf("%s", s + 1);
		init();
		n = strlen(s + 1);
		_rep(i,1,n) extend(i), pre[i] = last;
		_rep(i,1,n) s[n + i] = s[n - i + 1];
		SAM::init(s, n * 2);
		debug("%d\n", ask(4, 4));
		_rep(i,1,n) {
			debug("i = %d\n", i);
			vector<Info> L;
			int cur = pre[i], sum = 0;
			while(cur > 1) {
				L.push_back(Info{slink[cur], cur, dep[cur]});
				cur = fail[slink[cur]];
			}
			reverse(L.begin(), L.end());
			vector<int> ext(L.size());
			_rep(j,0,L.size() - 1) {
				int l = i - len[L[j].bot] + 1, r = i;
				int goal = (j == L.size() - 1 ? inf : len[L[j + 1].top]), cnt = 0;
				while(1) {
					int pos = ask(l, r); 
					if(pos == -1) break;
					l = pos - (r - l);
					if(r - l + 1 == goal) break;
					++cnt;
				}
				ext[j] = cnt;
			}
			for(int i = L.size() - 1; ~i; --i) {
				sum += ext[i];
				chkmax(ans[L[i].bot], sum);
				sum += L[i].cnt;
			}
		}
		for(int i = nc; i > 1; --i) {
			_rep(j,0,25) if(ch[i][j]) chkmax(ans[i], ans[ch[i][j]] + 1);
			chkmax(ans[fail[i]], ans[i] + 1);
		}
		int res = 0;
		_rep(i,0,25) if(ch[1][i]) chkmax(res, ans[ch[1][i]]);
		outln(res);
	}
	return 0;
}

/* 
a list of keywords
clear empty push_back pop_back push pop top front back
emplace_back emplace push_front pop_front insert erase
find count set reset bitset map vector string multiset
first second iterator prev next deque multimap reverse
sort begin end list modify query init check calc prime
putchar getchar puts scanf printf max min swap replace
make_pair make_tuple numeric_limits auto function null
*/

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 26544kb

input:

3
aaaa
abbaabba
xy

output:

3
4
0

result:

ok 3 number(s): "3 4 0"

Test #2:

score: 0
Accepted
time: 0ms
memory: 24148kb

input:

15
eeee
ooom
bbcb
yyaa
ssdn
wgww
hrhr
exer
hcch
qyyy
lppa
ocvo
orxr
lrjj
pztv

output:

3
2
1
1
1
1
1
1
2
2
1
1
1
1
0

result:

ok 15 numbers

Test #3:

score: 0
Accepted
time: 0ms
memory: 24492kb

input:

52
eeeee
oooom
bbbcb
yyyaa
sssdn
wwgww
hhrhr
eexer
hhcch
qqyyy
llppa
oocvo
oorxr
llrjj
ppztv
tnttt
vnvvn
hthhp
jzjzj
nrnrr
gqgqt
uruyu
cdchd
djdhh
ktkfy
piipp
zaaza
uffuq
bvvvb
hkkkk
pcccj
qccpq
wqqaq
appgg
cxxvg
ewfee
peupe
odfof
kdpkh
zotoz
yzkzz
irtrt
vxyxi
dlood
akrrk
nsbbb
rdjjc
bfexb
uxsex
ise...

output:

4
3
2
2
2
2
1
1
2
2
1
1
1
1
1
2
2
1
2
1
1
1
1
1
1
2
2
2
3
3
2
1
1
1
1
1
1
1
1
2
1
1
1
1
2
2
1
1
1
1
1
0

result:

ok 52 numbers

Test #4:

score: 0
Accepted
time: 2ms
memory: 24272kb

input:

203
eeeeee
ooooom
bbbbcb
yyyyaa
ssssdn
wwwgww
hhhrhr
eeexer
hhhcch
qqqyyy
lllppa
ooocvo
ooorxr
lllrjj
pppztv
ttnttt
vvnvvn
hhthhp
jjzjzj
nnrnrr
ggqgqt
uuruyu
ccdchd
ddjdhh
kktkfy
ppiipp
zzaaza
uuffuq
bbvvvb
hhkkkk
ppcccj
qqccpq
wwqqaq
aappgg
ccxxvg
eewfee
ppeupe
oodfof
kkdpkh
zzotoz
yyzkzz
iirtrt
vv...

output:

5
4
3
3
3
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
1
1
1
1
1
3
2
2
3
3
2
1
1
1
1
2
1
1
1
2
1
1
1
1
2
2
1
1
1
1
1
1
3
3
2
3
2
2
1
1
1
1
2
2
2
2
2
1
1
1
1
1
1
2
1
1
1
1
1
1
2
1
2
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
3
3
3
4
4
3
2
2
2
2
1
1
1
1
1
2
1
1
1
2
2
1
1
1
1
1
1
2
1
2
1
1
1
1
1
1
2
1
1
1
1
1
1
1
2
2
2
2
1
2
2
...

result:

ok 203 numbers

Test #5:

score: 0
Accepted
time: 0ms
memory: 26308kb

input:

877
eeeeeee
oooooom
bbbbbcb
yyyyyaa
sssssdn
wwwwgww
hhhhrhr
eeeexer
hhhhcch
qqqqyyy
llllppa
oooocvo
oooorxr
llllrjj
ppppztv
tttnttt
vvvnvvn
hhhthhp
jjjzjzj
nnnrnrr
gggqgqt
uuuruyu
cccdchd
dddjdhh
kkktkfy
pppiipp
zzzaaza
uuuffuq
bbbvvvb
hhhkkkk
pppcccj
qqqccpq
wwwqqaq
aaappgg
cccxxvg
eeewfee
pppeupe
...

output:

6
5
4
4
4
3
3
3
3
3
3
3
3
3
3
3
2
2
2
2
2
2
2
2
2
3
2
2
3
3
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
3
3
2
3
2
2
2
2
2
2
3
2
2
2
2
1
1
1
1
1
2
2
1
1
1
1
1
1
2
1
2
1
1
1
1
1
1
3
3
3
2
2
2
2
2
2
2
4
3
3
4
4
3
2
2
2
2
2
1
1
1
1
2
1
1
1
2
2
1
1
1
1
1
1
2
2
2
2
1
1
1
1
1
2
1
1
1
1
1
1
1
3
2
2
2
1
2
2
...

result:

ok 877 numbers

Test #6:

score: -100
Wrong Answer
time: 12ms
memory: 28480kb

input:

4140
eeeeeeee
ooooooom
bbbbbbcb
yyyyyyaa
ssssssdn
wwwwwgww
hhhhhrhr
eeeeexer
hhhhhcch
qqqqqyyy
lllllppa
ooooocvo
ooooorxr
lllllrjj
pppppztv
ttttnttt
vvvvnvvn
hhhhthhp
jjjjzjzj
nnnnrnrr
ggggqgqt
uuuuruyu
ccccdchd
ddddjdhh
kkkktkfy
ppppiipp
zzzzaaza
uuuuffuq
bbbbvvvb
hhhhkkkk
ppppcccj
qqqqccpq
wwwwqqa...

output:

7
6
5
5
5
4
4
4
4
4
4
4
4
4
4
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
2
2
2
2
2
2
3
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
4
3
3
2
2
2
2
2
2
2
4
3
3
4
4
3
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
3
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
3
2
2
2
2
2
2
...

result:

wrong answer 1940th numbers differ - expected: '1', found: '2'