ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#200487 | #2422. 名字 | UperFicial | 100 | 498ms | 50768kb | C++11 | 2.8kb | 2024-01-04 07:53:47 | 2024-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