QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#351632#6419. Baby's First Suffix Array ProblemcrsfaaWA 868ms6728kbC++144.0kb2024-03-12 09:19:582024-03-12 09:19:58

Judging History

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

  • [2024-03-12 09:19:58]
  • 评测
  • 测评结果:WA
  • 用时:868ms
  • 内存:6728kb
  • [2024-03-12 09:19:58]
  • 提交

answer

#include<bits/stdc++.h>
#define Yukinoshita namespace
#define Yukino std
using Yukinoshita Yukino;
int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') w=ch=='-'?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return s*w;
}
const int mxn=2e5+5;
struct SA
{
    #define f(i,a,b) for(i=a;i<=b;i++)
    #define e(i,a,b) for(i=a;i>=b;i--)
    int sa[mxn],height[mxn];
    int cnt[mxn],rk[mxn];
    int preN;
    void S_sort(char s[],int l,int m)
    {
        int i,k,ct;
        f(i,1,l) cnt[height[i]=s[i]]++;
        f(i,2,m) cnt[i]+=cnt[i-1];
        e(i,l,1) sa[cnt[height[i]]--]=i;
        for(k=1;k<=l;k*=2)
        {
            ct=0;
            f(i,l-k+1,l) rk[++ct]=i;
            f(i,1,l)
                if(sa[i]>k)
                    rk[++ct]=sa[i]-k;
            f(i,1,m) cnt[i]=0;
            f(i,1,l) cnt[height[i]]++;
            f(i,2,m) cnt[i]+=cnt[i-1];
            e(i,l,1) sa[cnt[height[rk[i]]]--]=rk[i],rk[i]=0;
            swap(height,rk);
            height[sa[1]]=m=1;
            f(i,2,l)
                height[sa[i]]=m=m+!(rk[sa[i]]==rk[sa[i-1]]&&rk[sa[i]+k]==rk[sa[i-1]+k]);
            if(m==l) return;    
        }
    }
    void build(char s[],int l,int m)
    {
    	memset(cnt,0,preN);
    	memset(rk,0,preN);
    	memset(height,0,preN);
    	memset(sa,0,preN);
        S_sort(s,l,m);    
        int i,j,k;
        for(i=1;i<=l;i++)
            rk[sa[i]]=i;
        for(i=1,k=0;i<=l;i++)
        {
            if(rk[i]==1) k=0;
            else
            {
                k-=k>0;
                int j=sa[rk[i]-1];
                while(i+k<=l&&j+k<=l&&s[i+k]==s[j+k])
                    k++;
            }
            height[rk[i]]=k;
        }
        preN=max(l,m)+1<<4;
    }
};
struct Word_RMQ
{
	#define w 32
	#define u unsigned
	#define be(x) ((x>>5)+1)
	#define bm mxn/w+5
	int *a;
	int ST[int(log2(bm)+1)][bm];
	int lg[bm];
	int l[bm],r[bm];
	struct node
	{
		u st[w+1];
		int *p;
		int ask(int l,int r)
		{
			return p[l+__builtin_ctz(st[r]>>l-1)];
		}
		void init(int *p_,int len)
		{
			p=p_;
			int i,top=0;
			int stack[w+1];
			for(i=1;i<=len;i++)
			{
				st[i]=st[i-1];
				while(top&&p[i]<p[stack[top]])
					st[i]-=1u<<stack[top--]-1;
				stack[++top]=i,st[i]+=1u<<i-1;
			}
		}
	}k[bm];
	void build(int A[],int n)
	{
		a=A;
		int i,j,cnt=0,mn;
		for(i=0;i<=n;i+=w)
			l[++cnt]=i,r[cnt]=min(n,i+w-1);
		l[1]=1;
		for(i=1;i<=cnt;i++)
		{
			k[i].init(a+l[i]-1,r[i]-l[i]+1);
			mn=INT_MAX;
			for(j=l[i];j<=r[i];j++)
				mn=min(mn,a[j]);
			ST[0][i]=mn;
		}
		for(j=1;(1<<j)<=cnt;j++)
			for(i=1;i+(1<<j)-1<=cnt;i++)
				ST[j][i]=min(ST[j-1][i],ST[j-1][i+(1<<(j-1))]);
		for(i=2;i<=cnt;i++)
			lg[i]=lg[i>>1]+1;
	}
	int STask(int L,int R)
	{
		if(L>R) return INT_MAX;
		int k=lg[R-L+1];
		return min(ST[k][L],ST[k][R-(1<<k)+1]);
	}
	int ask(int L,int R)
	{
		if(L>R) return INT_MAX;
		if(be(L)==be(R)) return k[be(L)].ask(L-l[be(L)]+1,R-l[be(L)]+1);
		return min({STask(be(L)+1,be(R)-1),ask(L,r[be(L)]),ask(l[be(R)],R)});
	}
	#undef w
}ds;
SA a;
int L;
void build(char s[],int l,int m)
{
	a.build(s,l,m);
	ds.build(a.height,l);
}
int asklcp(int x,int y)
{
	if(x==y) return L-x+1;
	x=a.rk[x],y=a.rk[y];
	if(x>y) swap(x,y);
	return ds.ask(x+1,y);
}
char s[mxn];
int ans[mxn];
int main()
{
	int T=read();
	while(T--)
	{
		int n=read(),m=read(),i,j,l,r,k,p;
		scanf("%s",s+1);
		build(s,n,'z');
		for(i=1;i<=m;i++)
		{
			int sum=1,w=a.rk[k];
			l=read(),r=read(),k=read();
			for(j=1<<20;j;j>>=1)
				w-=(w-j>=1&&ds.ask(w-j+1,a.rk[k])<=r-k)*j;
//			sum+=a.rk[k]-w+1;
			for(j=w;j<=a.rk[k];j++)
				sum+=a.sa[j]>=l&&a.sa[j]<k;
//			for(p=l;p<k;p++)
//				if(asklcp(p,k)<=r-k)
//					sum+=a.rk[p]<a.rk[k];
			for(p=k+1;p<=r;p++)
				if(p+asklcp(p,k)-1<r)
					sum+=a.rk[p]<a.rk[k];
				else sum++;
			ans[i]=sum;
		}
		for(i=1;i<=m;i++)
			printf("%d\n",ans[i]);
	}
}
/*
1
10 10
abaabbaabb
2 8 3

1
10 10
abaabbaabb
2 8 3
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 6212kb

input:

2
10 4
baaabbabba
2 8 3
1 1 1
2 3 2
2 5 4
20 3
cccbccbadaacbbbcccab
14 17 16
3 20 17
17 20 18

output:

2
1
2
3
4
15
3

result:

ok 7 numbers

Test #2:

score: -100
Wrong Answer
time: 868ms
memory: 6728kb

input:

8994
10 10
abaabbaabb
2 8 3
1 8 5
6 9 6
9 9 9
5 10 7
5 7 7
7 8 7
5 6 6
1 9 9
3 9 5
2 1
ab
1 2 1
8 6
bbabaabb
3 7 7
5 7 7
1 5 1
1 4 3
3 5 3
5 5 5
10 3
aababbaaab
3 4 4
6 9 8
4 6 6
7 3
babbaab
5 6 5
3 6 6
1 6 6
9 3
baaaabbba
2 5 2
8 9 8
1 4 4
9 2
babaababa
2 4 4
2 6 3
2 3
ba
1 2 2
1 2 1
2 2 2
10 2
aba...

output:

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

result:

wrong answer 9th numbers differ - expected: '6', found: '8'