UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#200487#2422. 名字UperFicial100498ms50768kbC++112.8kb2024-01-04 07:53:472024-01-04 12:05:41

answer

#include<bits/stdc++.h>
#define N 700005
#define lc tr[now].ls
#define rc tr[now].rs
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
struct tree
{
	int ls,rs,siz;
}tr[N*10];int cnt;
int n,m,mx[N],rt[N],tot=1,ch[N][27],fa[N],ed[N],ans[N];
int Push(int c,int last)
{
	if(ch[last][c])
	{
		int p=last,q=ch[last][c];
		if(mx[q]==mx[p]+1)return q;
		int nq=++tot;mx[nq]=mx[p]+1;
		fa[nq]=fa[q];fa[q]=nq;
		for(int i=1;i<=26;i++)ch[nq][i]=ch[q][i];
		for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
		return nq;
	}
	int np=++tot,p=last;mx[np]=mx[p]+1;
	for(;p&&ch[p][c]==0;p=fa[p])ch[p][c]=np;
	if(!p)fa[np]=1;
	else
	{
		int q=ch[p][c];
		if(mx[q]==mx[p]+1)fa[np]=q;
		else
		{
			int nq=++tot;mx[nq]=mx[p]+1;
			fa[nq]=fa[q];fa[q]=fa[np]=nq;
			for(int i=1;i<=26;i++)ch[nq][i]=ch[q][i];
			for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
		}
	}
	return np;
}
char c[N];
struct node{int l,r,id;};
vector<node> v[N];
vector<int> d[N];
struct fig
{
	int to,next;
}k[N*4];int head[N],awa;
void add(int from,int to)
{
	k[++awa].to=to;
	k[awa].next=head[from];
	head[from]=awa;
}
void up(int now){tr[now].siz=tr[lc].siz+tr[rc].siz;}
stack<int> t;
int news()
{
	int now;
	if(t.size())now=t.top(),t.pop();
	else now=++awa;
	lc=rc=tr[now].siz=0;
	return now;
}
int add(int now,int l,int r,int x)
{
	if(!now)now=news();
	if(l==r)
	{
		tr[now].siz++;
		return now;
	}
	int mid=(l+r)>>1;
	if(mid>=x)lc=add(lc,l,mid,x);
	else rc=add(rc,mid+1,r,x);
	up(now);
	return now;
}
int merge(int a,int b,int l,int r)
{
	if(!a||!b)return a+b;
	if(l==r)
	{
		tr[a].siz+=tr[b].siz;
		t.push(b);
		return a;
	}
	int mid=(l+r)>>1;
	tr[a].ls=merge(tr[a].ls,tr[b].ls,l,mid);
	tr[a].rs=merge(tr[a].rs,tr[b].rs,mid+1,r);
	t.push(b);
	up(a);return a;
}
int que(int now,int l,int r,int ql,int qr)
{
	if(!now)return 0; 
	if(l>=ql&&r<=qr)return tr[now].siz;
	int mid=(l+r)>>1,cnt=0;
	if(mid>=ql)cnt+=que(lc,l,mid,ql,qr);
	if(mid<qr)cnt+=que(rc,mid+1,r,ql,qr);
	return cnt;
}
void dfs(int now)
{
	for(int i=head[now];i;i=k[i].next)
	{
		dfs(k[i].to);
		rt[now]=merge(rt[now],rt[k[i].to],1,n);
	}
	for(int x:d[now])rt[now]=add(rt[now],1,n,x);
	for(node x:v[now])ans[x.id]=que(rt[now],1,n,x.l,x.r);
}
int main()
{
	n=read();m=read();
	for(int i=1,len;i<=n;i++)
	{
		cin>>(c+1);
		len=strlen(c+1);
		for(int j=1,last=1;j<=len;j++)
		{
			last=Push(c[j]-'a'+1,last);
			d[last].push_back(i);
			ed[i]=last;
		}
	}
	for(int i=1,l,r,k;i<=m;i++)
	{
		l=read();r=read();k=read();
		v[ed[k]].push_back(node{l,r,i});
	}
	for(int i=2;i<=tot;i++)add(fa[i],i);
	dfs(1);
	for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
	return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 3ms
memory: 34116kb

input:

10 100
bc
a
aaa
aaaccaaaca
caaabacbcaaaaccaaaaaccaaacaccaaaa
aaabacacbccbccaaabacbc
accaaaa
aaaccaaa...

output:

12
0
1
48
7
0
56
1
15
3
1
1
49
46
11
18
4
5
13
45
1
4
32
18
1
1
7
10
0
18
1
5
1
1
1
4
53
55
1
24
4
1...

result:

ok 100 lines

Test #2:

score: 10
Accepted
time: 0ms
memory: 34120kb

input:

5 100
ejmljknnjeldejmljknje
ldejmljknnjeldejmljknnjfldejmlj
jmkjknjeld
fldejmljknnjeldejmljknjeldejm...

output:

6
5
1
7
10
5
8
2
6
6
3
8
4
5
4
1
5
4
9
5
7
3
6
5
4
9
5
4
5
3
5
9
9
8
10
5
1
4
3
2
8
4
4
1
1
8
7
5
4
...

result:

ok 100 lines

Test #3:

score: 10
Accepted
time: 7ms
memory: 34244kb

input:

50 1000
aaacaaaabaaaaaaa
a
aaaacaaaabaaaaaaaabaaaa
aaaaaaaaacaaaabaaaaaaaabaaaaaaaaaaa
acbbaaabacaaa...

output:

129
77
0
21
274
11
72
109
26
7
284
18
173
19
349
8
15
5
27
6
51
311
39
371
1
3
44
6
12
492
323
346
3...

result:

ok 1000 lines

Test #4:

score: 10
Accepted
time: 8ms
memory: 34252kb

input:

30 1000
mgenjcfodhnmgenjcfodhnm
genjcfodhnmgenjcfodhnmgenjcfodhnmenjcfodhnmgenjcfodhnmenjcfodhnmgenj...

output:

23
10
77
28
11
25
40
8
56
41
15
0
2
39
2
52
79
4
60
4
10
40
20
84
82
8
0
4
42
24
6
68
23
3
7
10
77
4...

result:

ok 1000 lines

Test #5:

score: 10
Accepted
time: 86ms
memory: 44984kb

input:

500 100000
bcabcbbbcacaabccbccacaccbcacbccccbbaaabbabcbcccaababccbcabcbbbcacaabccbccacaccbcacb
cccbb...

output:

14
3954
226
633
528
2614
257
53
440
148
2144
768
268
17
284
185
234
30
481
495
202
0
1338
1694
4910
...

result:

ok 100000 lines

Test #6:

score: 10
Accepted
time: 81ms
memory: 46456kb

input:

500 100000
ehecbhadefejeehecehecbhadefejeehecehecbhadefejeehecehecbhadefejeehecehecbhadefejeehecehec...

output:

251
669
335
2013
1080
23
196
450
4697
1291
35
32
1332
9
45
877
723
1340
327
138
225
218
376
194
48
1...

result:

ok 100000 lines

Test #7:

score: 10
Accepted
time: 71ms
memory: 49460kb

input:

200 100000
cefdicgefchdcbbfabajbdhcga
efchcgacfahcgacfaaicfbhihciadedhacafcefdicgefchcgacfahcgacfaai...

output:

6
150
1
380
125
482
75
560
7
180
13
0
134
41
5
599
299
6
23
108
0
171
212
220
39
136
9
62
100
132
8
...

result:

ok 100000 lines

Test #8:

score: 10
Accepted
time: 75ms
memory: 46032kb

input:

500 100000
qhyovpqmdmxzpedsswqrydaogpfjitkxfowgmxglflchcnxzjkcfqhylvpqmdmxzpedsswqrydaogpfjitkxfowgm...

output:

206
393
721
78
191
1162
84
3302
1404
918
31
57
62
234
27
150
2744
1260
88
71
193
208
1437
853
2093
4...

result:

ok 100000 lines

Test #9:

score: 10
Accepted
time: 89ms
memory: 50768kb

input:

200 100000
jjidrjrmjjhkrxsraaaqduplrcznisidrjrmjjidxjrmjjrxsraaaqaaqduslrcznisidrjrmjjidrjrmjjhkrxsr...

output:

6
390
975
291
3
136
6
264
160
125
98
1794
1
17
493
0
2
310
40
1589
11
3
81
146
13
450
5
216
11
66
43...

result:

ok 100000 lines

Test #10:

score: 10
Accepted
time: 78ms
memory: 43524kb

input:

1000 100000
cbabbcbbbbcbbbccacbabbcbbbbcbbbccacbabbcbbbbcbbbccacbabbcbbbbcbbbccacbabbcbb
bccacb
babb...

output:

23
3036
159
187
11472
909
2
257
173
96
1070
21215
459
920
2680
7901
17396
513
3992
1460
31684
4245
2...

result:

ok 100000 lines

Extra Test:

score: 0
Extra Test Passed