QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#104705#4882. String Strange Sum1kriTL 2862ms183780kbC++145.7kb2023-05-11 18:58:582023-05-11 18:59:02

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-11 18:59:02]
  • 评测
  • 测评结果:TL
  • 用时:2862ms
  • 内存:183780kb
  • [2023-05-11 18:58:58]
  • 提交

answer

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define ll long long
using namespace std;
int t,n;
ll ans;
char s[200005];
struct sam_node{
	int son[26],len,link;
	sam_node(){
		memset(son,0,sizeof(son));
		len=0,link=-1;
		return;
	}
	void clear(){
		memset(son,0,sizeof(son));
		len=0,link=-1;
		return;
	}
}sam[400005];
int sam_cnt,last;
int sam_ins(char x){
	int p=last;
	int now=++sam_cnt;
	sam[now].len=sam[p].len+1;
	while(p!=-1&&sam[p].son[x-'a']==0){
		sam[p].son[x-'a']=now;
		p=sam[p].link;
	}
	if (p==-1){
		sam[now].link=0;
		last=now;
		return now;
	}
	int q=sam[p].son[x-'a'];
	if (sam[q].len==sam[p].len+1){
		sam[now].link=q;
		last=now;
		return now;
	}
	int clone=++sam_cnt;
	sam[clone]=sam[q];
	sam[clone].len=sam[p].len+1;
	sam[now].link=sam[q].link=clone;
	while(p!=-1&&sam[p].son[x-'a']==q){
		sam[p].son[x-'a']=clone;
		p=sam[p].link;
	}
	last=now;
	return now;
}
int endpos[400005];
int u[400005],v[400005],first[400005],nxt[400005];
int sz[400005],son[400005];
struct DS{
	int id_tot;
	map<int,int> id;
	vector<set<int>> h;
	struct node{
		int l,r,cnt;
		bool operator <(const node &y)const{
			if (l!=y.l)return l<y.l;
			if (r!=y.r)return r<y.r;
			return cnt<y.cnt;
		}
	};
	node make_node(int l,int r,int cnt){
		node ans;
		ans.l=l,ans.r=r,ans.cnt=cnt;
		return ans;
	}
	set<node> c;
	struct node2{
		int v;
		node e;
		bool operator <(const node2 &y)const{
			if (v!=y.v)return v<y.v;
			return e<y.e;
		}
	};
	node2 make_node2(int v,node e){
		node2 ans;
		ans.v=v,ans.e=e;
		return ans;
	}
	set<node2> d;
	ll sum;
	int get_r(int x){
		set<node>::iterator it=c.lower_bound(make_node(x,x,0));
		if (it==c.end()||(*it).l>x)it--;
		return (*it).r;
	}
	void out(){
		set<node>::iterator it=c.begin();
		while(it!=c.end()){
			int r=(*it).r;
			int t=id[r]-1;
			for (set<int>::iterator _it=h[t].begin();_it!=h[t].end();_it++)cout<<(*_it)<<' '<<r<<endl;
			it++;
		}
		return;
	}
	void ins_c(node qwq){
		node pre=make_node(-1,-1,-1),nxt=make_node(-1,-1,-1);
		set<node>::iterator it=c.lower_bound(qwq);
		if (it!=c.end())nxt=(*it);
		if (it!=c.begin()){
			set<node>::iterator _it=it;
			_it--;
			pre=(*_it);
		}
		c.insert(qwq);
		if (nxt.l!=-1&&pre.l!=-1)d.erase(make_node2(nxt.l-pre.r,pre));
		if (pre.l!=-1)d.insert(make_node2(qwq.l-pre.r,pre));
		if (nxt.l!=-1)d.insert(make_node2(nxt.l-qwq.r,qwq));
		sum+=1ll*qwq.r*qwq.cnt;
		return;
	}
	void del_c(node qwq){
		c.erase(qwq);
		node pre=make_node(-1,-1,-1),nxt=make_node(-1,-1,-1);
		set<node>::iterator it=c.lower_bound(qwq);
		if (it!=c.end())nxt=(*it);
		if (it!=c.begin()){
			set<node>::iterator _it=it;
			_it--;
			pre=(*_it);
		}
		if (nxt.l!=-1&&pre.l!=-1)d.insert(make_node2(nxt.l-pre.r,pre));
		if (pre.l!=-1)d.erase(make_node2(qwq.l-pre.r,pre));
		if (nxt.l!=-1)d.erase(make_node2(nxt.l-qwq.r,qwq));
		sum-=1ll*qwq.r*qwq.cnt;
		return;
	}
	void ins(int x,int r){
		if (id[r]==0){
			id[r]=++id_tot;
			set<int> qwq;
			qwq.insert(x);
			h.push_back(qwq);
			ins_c(make_node(x,r,1));
		}
		else{
			int t=id[r]-1;
			del_c(make_node((*h[t].begin()),r,h[t].size()));
			h[t].insert(x);
			ins_c(make_node((*h[t].begin()),r,h[t].size()));
		}
		return;
	}
	void del(int x,int r){
		int t=id[r]-1;
		del_c(make_node((*h[t].begin()),r,h[t].size()));
		h[t].erase(x);
		if (h[t].size()>0)ins_c(make_node((*h[t].begin()),r,h[t].size()));
		return;
	}
	void merge(int x,int y){
		if (h[x].size()>h[y].size())swap(h[x],h[y]);
		for (set<int>::iterator it=h[x].begin();it!=h[x].end();it++)h[y].insert(*it);
		h[x].clear();
		return;
	}
	ll upd(int len_l,int len_r){
		ll ans=0;
		int last=len_l;
		while(d.begin()!=d.end()&&(*d.begin()).v<=len_r){
			set<node>::iterator it=c.find((*d.begin()).e);
			set<node>::iterator _it=it;
			ans+=1ll*((*d.begin()).v-last)*sum;
			last=(*d.begin()).v;
			_it++;
			node qwq=make_node((*it).l,(*_it).r,(*it).cnt+(*_it).cnt);
			merge(id[(*it).r]-1,id[(*_it).r]-1);
			del_c(*it);
			del_c(*_it);
			ins_c(qwq);
		}
		ans+=1ll*(len_r-last+1)*sum;
		return ans;
	}
	void clear(){
		id_tot=0;
		id.clear();
		h.clear();
		c.clear();
		d.clear();
		sum=0;
		return;
	}
}ds[400005];
void clear(){
	ans=0;
	last=0;
	for (int i=0;i<=sam_cnt;i++){
		sam[i].clear();
		endpos[i]=0;
		u[i]=v[i]=first[i]=nxt[i]=0;
		sz[i]=son[i]=0;
		ds[i].clear();
	}
	sam_cnt=0;
	return;
}
void dfs1(int now){
	sz[now]=1;
	son[now]=-1;
	for (int i=first[now];i;i=nxt[i]){
		dfs1(v[i]);
		sz[now]+=sz[v[i]];
		if (son[now]==-1||sz[v[i]]>sz[son[now]])son[now]=v[i];
	}
	return;
}
void upd_ds(int now,int t0,int t1){
	if (endpos[now]!=0){
		int x=endpos[now];
		int r=ds[t0].get_r(x);
		ds[t1].ins(x,r);
		ds[t0].del(x,r);
	}
	for (int i=first[now];i;i=nxt[i])upd_ds(v[i],t0,t1);
	return;
}
void dfs2(int now){
	if (now>0){
		int len_l=sam[sam[now].link].len+1;
		int len_r=sam[now].len;
		ans+=ds[now].upd(len_l,len_r);
	}
	for (int i=first[now];i;i=nxt[i])
		if (v[i]!=son[now]){
			upd_ds(v[i],now,v[i]);
			dfs2(v[i]);
		}
	if (endpos[now]!=0){
		int x=endpos[now];
		int r=ds[now].get_r(x);
		ds[now].del(x,r);
	}
	if (son[now]!=-1){
		swap(ds[now],ds[son[now]]);
		dfs2(son[now]);
	}
	return;
}
int main(){
	cin>>t;
	while(t--){
		scanf("%s",s+1);
		n=strlen(s+1);
		reverse(s+1,s+1+n);
		for (int i=1;i<=n;i++)endpos[sam_ins(s[i])]=i;
		for (int i=1;i<=sam_cnt;i++){
			u[i]=sam[i].link,v[i]=i;
			nxt[i]=first[u[i]],first[u[i]]=i;
		}
		dfs1(0);
		for (int i=1;i<=n;i++)ds[0].ins(i,i);
		dfs2(0);
		for (int i=1;i<=n;i++)ans-=1ll*i*i;
		cout<<ans<<endl;
		clear();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 27ms
memory: 119244kb

input:

8
aa
ab
ababa
abaaba
abacaba
abaaababaab
aababcabcbc
abcdabcabaabcd

output:

1
0
6
7
0
74
51
20

result:

ok 8 numbers

Test #2:

score: 0
Accepted
time: 368ms
memory: 119284kb

input:

100000
ff
ki
wb
vc
bb
cq
tt
gl
xb
tt
ll
it
bb
yy
dd
yg
tt
vq
gg
ua
ff
nn
aa
yq
ee
ae
sj
yy
cd
qk
vk
ts
tt
cm
rr
yk
sh
fv
vm
rr
tl
vv
bb
rl
jx
pv
tx
ib
dp
oo
lx
jo
bb
dl
sj
sn
db
kk
oo
rk
yy
gz
ff
ha
ja
ax
hn
ww
ms
yy
kf
zz
ss
ii
km
uv
mn
si
ng
hh
yq
lq
bq
ed
bb
bw
jj
pp
ss
xg
ff
gm
ee
cc
fn
vv
rc
nn...

output:

1
0
0
0
1
0
1
0
0
1
1
0
1
1
1
0
1
0
1
0
1
1
1
0
1
0
0
1
0
0
0
0
1
0
1
0
0
0
0
1
0
1
1
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
1
0
1
0
1
0
0
0
0
1
0
1
0
1
1
1
0
0
0
0
0
1
0
0
0
0
1
0
1
1
1
0
1
0
1
1
0
1
0
1
0
0
1
1
1
0
0
0
1
1
0
0
1
1
1
0
1
1
1
1
1
0
0
1
0
0
0
1
1
1
0
0
1
0
1
1
1
1
1
1
0
0
0
0
0
1
0
1
0
0
0
1
...

result:

ok 100000 numbers

Test #3:

score: 0
Accepted
time: 254ms
memory: 119284kb

input:

40000
nbbnn
tttuu
rfeer
omhom
qqcmq
yyiyi
tlttt
jhjtj
ixiyx
bnnon
iwpiw
uzluz
ffqfj
dyddl
szkss
dauud
dddiy
gggtt
ebbee
uboob
nnnnv
rrjrj
cjccj
xnnyy
mwmjw
wyyyq
vvuvp
vyzyv
sssss
vvsvs
rhxxr
pkkpk
xsxss
ngncn
wzwjz
khkth
jjjjj
vvvbb
unnxn
aqlqq
mmgmg
iiiji
lyllv
luuuu
itizt
fsffs
xggii
jqqtj
mummd
...

output:

4
11
2
0
4
7
4
0
0
3
0
0
4
2
1
2
10
11
4
2
16
7
4
4
0
7
4
0
20
7
2
3
5
0
0
0
20
11
3
1
7
10
2
10
0
4
4
3
2
3
4
6
1
4
10
3
6
10
10
16
7
7
0
10
5
0
2
16
0
6
1
0
1
2
5
2
5
6
20
10
0
8
10
3
16
7
0
8
4
3
0
1
7
0
2
4
4
5
3
7
2
4
16
4
1
8
10
7
4
3
4
4
6
2
2
4
6
2
4
5
4
3
10
5
0
4
16
2
3
0
3
4
1
1
4
4
11
2
...

result:

ok 40000 numbers

Test #4:

score: 0
Accepted
time: 316ms
memory: 119140kb

input:

20000
iijjijiijj
fxffxfffxx
kkiiiiiiii
oppopopppo
iiooiioooi
gggxxxxggg
oxxoxxxoox
puuuppupuu
ppssspspps
eefffeefff
xxtxxxttxt
yyppypyppp
kkwwkkwwkk
bvvvbvbbbv
attataaaat
boooobbobo
hhhhfhhhff
nnhhhnhhhh
cdccccdccd
axxxaxaxxa
qqnnnnnqnq
eeexxeeeex
ppkkkkkkkp
uusussusss
iwiwiiwiii
gglgllgggg
wwwrrrwr...

output:

40
58
93
52
52
57
56
34
44
46
52
46
57
47
41
47
87
48
56
52
65
47
86
56
61
50
51
34
58
41
52
47
60
92
61
56
64
55
65
48
56
77
80
62
55
57
41
58
44
93
63
49
54
59
50
55
111
58
52
52
39
35
63
50
111
84
140
75
78
40
99
56
49
40
68
45
87
54
47
59
52
59
50
86
82
54
48
59
33
121
84
44
33
40
62
55
46
121
6...

result:

ok 20000 numbers

Test #5:

score: 0
Accepted
time: 440ms
memory: 119188kb

input:

10000
jlljjjlllljjjjljllll
uooooouuouoouoooouuo
utttutuuttuuuutttutu
xccxxxccxxccccxcxxxc
sjjsjjsjjssjjsssjjjs
fgffffgfgggfgfgfffgf
ddaaadaadadddadadaaa
tbbbbttttttbtttbtbtt
eeeeeekkkekeeeekeeke
dddddmdmmmmdddmmddmm
yykkkkykkykykkkkyykk
ededeedddededeedddee
kktttkktktkktkkkttkk
fcfcfcffffcffcccccfc
...

output:

339
332
348
341
662
367
363
432
395
371
452
460
353
472
416
420
464
365
589
476
516
407
446
376
501
364
354
424
366
438
330
590
553
491
662
317
467
374
422
406
492
484
405
328
396
654
300
410
447
404
389
487
534
688
489
370
396
474
396
467
364
424
380
236
480
506
506
339
297
316
457
626
338
349
351
...

result:

ok 10000 numbers

Test #6:

score: 0
Accepted
time: 644ms
memory: 119492kb

input:

4000
urrrrrrrrururrruruuuuuuuuruurruuruuuurrruurruurruu
hthtthttthhhtttthhhhthhhhthhhttthtthhtthhtttttthhh
ttssssssttsststttsttttssstsssstsstssttssststttstst
iiniiiiiniinnniiniiiiniiiinnniiinniiininniinnnnnni
dddpdpddpdpdppppdpdppdpdpddppppddddpdpdddppppdppdp
mmmsmmmmsmmmmmmsmmmmsmmmmsssmmssmssmsmsm...

output:

5599
5287
4294
4818
5746
7893
3623
3453
5390
5812
5608
5541
6069
5655
3743
3847
4866
5059
3876
3925
5018
4379
5016
5747
5333
5271
3890
5894
5141
3773
4196
4880
5111
5510
4334
3825
6188
5960
4893
5359
4720
4167
4042
4051
5011
6457
3807
3837
4612
4859
5044
6861
4330
5967
5001
4857
4340
3957
4152
4230
...

result:

ok 4000 numbers

Test #7:

score: 0
Accepted
time: 827ms
memory: 120336kb

input:

2000
ffffccfcfcfcfccffcccfcccfcfccfcccccfcfcccfccfcccccffffcccfcccffffffcffffccccffffffccffffcccfcccfcfff
enneeenneneennnnneeeeeenenneeennnnneneneneenneenneennnnnnnnenennennnneneneneeenennnneennnenneennnnne
mzmzmmzzmzzmzzmmzmmmzzmmmzzzzmmmzmmzzmzzmmmzzmzmzmmzzmmmmzmmmmmmzzmmmzmmmmzmmzmzmmzzmzmmmmmzm...

output:

32329
22810
31196
27570
28177
29004
24676
27293
26336
28196
28972
25095
34989
26711
26498
29643
24727
22723
31605
30180
43766
27097
25766
26819
28516
28122
34935
27399
33153
32281
26033
24708
41701
21704
24011
27481
26913
23270
31778
27676
25970
38135
25776
23316
44300
29424
24305
23476
29598
24423
...

result:

ok 2000 numbers

Test #8:

score: 0
Accepted
time: 1004ms
memory: 124084kb

input:

1000
udduuddduududddudduuduuuduuududdduuduuduudududdduuddddduuuuddduuuuudduddduuddddududduuduuuuuduuduudduuuuuuuddduuduuduuuudududduuuuududuudduduuduuduududddudududdududuududuudududdduddduuuuuuuuuuuddduduu
kykykkykyykkykkkkkkyykkyyyyyykyyykkkyykkyykyyyykkykykkkykkykkkyyykyyyyykkkyyykykykkkkyyykkyyyy...

output:

153694
145776
132786
133300
133959
177645
148786
132135
169466
159430
133110
171068
168822
120233
160090
125272
130139
138522
163688
161504
146208
170689
149990
147133
129161
146576
129200
138709
133553
154659
136204
167106
167771
151156
129986
137285
131065
131582
159289
158241
141081
128564
167348...

result:

ok 1000 numbers

Test #9:

score: 0
Accepted
time: 1509ms
memory: 141004kb

input:

200
zzzzzzzzzzzzzzzazzzazzzzzzzaazzaaaazaazzaazzazaazazazazzzazazaazzazzaazaaaazaaazzzzzazzzazzaaazzazzazazaazzzazaaaaaazzzaazzzazaazzzzzaaaazazazazzzzaaaaazaazzzzazzzazazaaazazzzaazaazazazzzzazaazaazaaaazzzzzazzazzzazzzzzzazzaazzzazzzzazzzzaaazzzaaazzzzzazzaazzzzazaazzaaaaazzazazzaaaaazzzzzaaazzazz...

output:

6229118
5438629
6162119
5350067
5263770
5443998
6419968
6592325
5876576
5249432
6397577
5947645
5851620
6059174
6048260
5774316
6323371
6103930
5794311
5297842
5559753
6109729
5724850
5095495
5263069
5635785
5916607
5959557
5261499
5446440
5526488
5504207
7229030
5767214
5191558
5475249
5537449
6169...

result:

ok 200 numbers

Test #10:

score: 0
Accepted
time: 2862ms
memory: 183780kb

input:

20
nnnllllnlnnllllllllllllnnnnllnnlllnnnnnnnlnlnnlnllnnlnnnnnnnnnllllnlllnnnlnllnnnlnnllnnlnnllnnnllnlnllnllllnnnlllnllllnlnnllnllllnnlllnnnlllnlnnnnlllnnnlnlnnlnllnnlnllnlllllllnnnnnnnnlnnlllnlnnnllnlllllnlnnllnllllnnnnnnnnnlnnnnnnnnlnlnnnllllllnllnlllnnnlnllnllnnllllllllllnnllnllllnlllnlllnlnnnlll...

output:

894196857
938803119
931699133
881434935
917400222
988704236
829814492
910180484
875107867
927874072
861165839
857715013
907953346
879864017
925887954
884818843
920746630
936583374
887419288
927606368

result:

ok 20 numbers

Test #11:

score: -100
Time Limit Exceeded

input:

5
omomomommomommommoooommmommmoommmomommmoomoomoomomomoooommmmmmoomomomoommoooommommmooommomoomomommmmmmomooomoommomoommomoooooomoomomooommmommmmooooooomoooommmmomooomoommmmmomoooomommomomomommmomommmommoooomooommomooomoomoommmmmmmoomoommoomommommmmommmmmmmmmoooomomoooomoommmmoomooomomooommmmmoommom...

output:

17174226584
17605268588
18296766446
17539695533

result: