QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#898892#6361. 字符串gutongxing100 ✓955ms87668kbC++207.0kb2025-02-15 09:19:192025-02-15 09:19:19

Judging History

This is the latest submission verdict.

  • [2025-02-15 09:19:19]
  • Judged
  • Verdict: 100
  • Time: 955ms
  • Memory: 87668kb
  • [2025-02-15 09:19:19]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
//#define int long long
namespace gtx{
//	Fast IO
	char *p1,*p2,buf[100000];
#define getchar() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
//	int read()
//	{
//		int x=0,f=1;
//		char ch=nc();
//		while(ch<48||ch>57)
//		{
//			if(ch=='-')
//				f=-1;
//			ch=nc();
//		}
//		while(ch>=48&&ch<=57)
//			x=x*10+ch-48,ch=nc();
//		return x*f;
//	}
	
	inline void read(int &x){
		x = 0;int h = 1;char tmp;
		do{tmp=getchar();if(tmp=='-')h*=-1;}while(!isdigit(tmp));
		while(isdigit(tmp)) x*=10,x+=tmp-'0',tmp=getchar();
		x*=h;
	}
	inline void read(char &x){do{x=getchar();}while(x==' '||x=='\n'||x=='\r');}
	inline void write(char x){putchar(x);}
	inline void write(int x){
		if(x<0) putchar('-'),x=-x;int st[200]={0},tot=0;
		do st[++tot]=x%10,x/=10; while(x);
		while(tot){putchar(st[tot--]+'0');}
	}
	inline void write(int x,char y){write(x);write(y);}
#define MAXN 200010
#define INF 0x3f3f3f3f
	namespace everything{
		int n,m,a[MAXN];
		char S[MAXN];
	}
	using namespace everything;
	namespace SuffArray{
		int p,q;
		int v[MAXN],rk[2][MAXN],sa[2][MAXN];
		inline void calcSA(int sa[MAXN],int rk[MAXN],int SA[MAXN],int RK[MAXN],int k){
			for(int i = 1;i<=n;i++) v[rk[sa[i]]]=i;
			// ????????????????
			for(int i = n;i;i--){
				if(sa[i]>k){
					SA[v[rk[sa[i]-k]]--] = sa[i]-k;
					// ?????????????????
				}
			}
			for(int i = n-k+1;i<=n;i++) SA[v[rk[i]]--]=i;// ???????????
			for(int i = 1;i<=n;i++){
				RK[SA[i]] = RK[SA[i-1]]+(rk[SA[i]]!=rk[SA[i-1]]||rk[SA[i]+k]!=rk[SA[i-1]+k]);
			}
		}
		inline void workoutSAandRK(){
			p = 0;q = 1;
			for(int i = 1;i<=n;i++) v[a[i]]++;
			for(int i = 1;i<=256;i++) v[i] += v[i-1];
			for(int i = 1;i<=n;i++){
				sa[p][v[a[i]]--] = i;
			}
			for(int i = 1;i<=n;i++){
				rk[p][sa[p][i]] = rk[p][sa[p][i-1]]+(a[sa[p][i-1]]!=a[sa[p][i]]);
			}
			int k = 1;
			for(;k<n;k<<=1){
				calcSA(sa[p],rk[p],sa[q],rk[q],k);
				swap(p,q);
			}
		}
#define RK SuffArray::rk[SuffArray::p]
#define SA SuffArray::sa[SuffArray::p]
		int h[MAXN];
		inline void get_h(){
			int k = 0;
			for(int i = 1;i<=n;i++){
				if(RK[i]==1) h[RK[i]] = 0;
				else{
					int j = SA[RK[i]-1];
					while(a[j+k]==a[i+k]) k++;
					h[RK[i]] = k;if(k>0) k--;
				}
			}
		}
		inline void init(){
			workoutSAandRK();
			get_h();
		}
	}
	using namespace SuffArray;
	namespace segmen {
        namespace ZhuXiShu{
            struct segmentree{
                int l,r;
                int lson,rson;
                int sum;
            }tree[20000000];
            void pushup(int k){
                tree[k].sum = tree[tree[k].lson].sum+tree[tree[k].rson].sum;
            }
            int segmentsum;
            int build(int l,int r){
                int k = ++segmentsum;
                tree[k].l = l;
                tree[k].r = r;
                return k; 
            }
            int build(segmentree x){
                int k = ++segmentsum;
                tree[k] = x;
                return k;
            }
            int root[MAXN];
            void modify(int k,int x){
                if(tree[k].l>x||tree[k].r<x) return;
                if(tree[k].l==x&&tree[k].r==x) return tree[k].sum++,void();
                int mid = (tree[k].l+tree[k].r)>>1;
                if(tree[k].lson) tree[k].lson = build(tree[tree[k].lson]);
                else tree[k].lson = build(tree[k].l,mid);
                if(tree[k].rson) tree[k].rson = build(tree[tree[k].rson]);
                else tree[k].rson = build(mid+1,tree[k].r);
                modify(tree[k].lson,x);
                modify(tree[k].rson,x);
				pushup(k);
            }
            int rank(int lroot,int rroot,int l,int r,int x){
                auto Sum = [](int lroot,int rroot){
                    return tree[rroot].sum-tree[lroot].sum;
                };
                if(Sum(lroot,rroot)==0) return 0;
                if(r<x) return Sum(lroot,rroot);
                if(l>x) return 0;
                if(l==r) return 0;
                int mid = (l+r)>>1;
                return rank(tree[lroot].lson,tree[rroot].lson,l,mid,x)+
                       rank(tree[lroot].rson,tree[rroot].rson,mid+1,r,x);
            }
            int kth(int lroot,int rroot,int l,int r,int x){
                if(l==r) return l;
                auto Sum = [](int lroot,int rroot){
                    return tree[rroot].sum-tree[lroot].sum;
                };
                if(Sum(tree[lroot].lson,tree[rroot].lson)>=x) return kth(tree[lroot].lson,tree[rroot].lson,l,(l+r)>>1,x);
                return kth(tree[lroot].rson,tree[rroot].rson,(l+r)/2+1,r,x-Sum(tree[lroot].lson,tree[rroot].lson));
            }
            int ask_pre(int lroot,int rroot,int x){
                int Rk = rank(lroot,rroot,1,n,x+1);
                if(Rk==0) return -INF;
                return kth(lroot,rroot,1,n,Rk);
            }
            int ask_suf(int lroot,int rroot,int x){
                int Rk = rank(lroot,rroot,1,n,x);
                if(Rk==tree[rroot].sum-tree[lroot].sum) return INF;
                return kth(lroot,rroot,1,n,Rk+1);
            }
        }
		namespace GuanYuHDeXianDuanShu{
			int L[MAXN<<2],R[MAXN<<2];
			int minn[MAXN<<2];
			inline void pushup(int k){
				minn[k] = min(minn[k*2],minn[k*2+1]);
			}
			inline void build(int k,int l,int r){
				L[k] = l;
				R[k] = r;
				if(l==r){
					minn[k] = h[l];
					return;
				}
				int mid = (l+r)>>1;
				build(k*2,l,mid);
				build(k*2+1,mid+1,r);
				pushup(k);
			}
			inline int ask_minn(int k,int l,int r){
				if(L[k]>r||R[k]<l) return INF;
				if(L[k]>=l&&R[k]<=r) return minn[k];
				return min(ask_minn(k*2,l,r),ask_minn(k*2+1,l,r));
			}
		}
		using namespace ZhuXiShu;
		using namespace GuanYuHDeXianDuanShu;
	}
	using namespace segmen;
#define q everything::q
	inline int Q(int x,int y){
		if(x>y) swap(x,y);
		return ask_minn(1,x+1,y);
	}
	bool check(int a,int b,int c,int d,int mid){
		int L = a,R = b-mid;
		if(L>R) return true;
		int pre = ask_pre(root[L-1],root[R],RK[c]);
//		cout <<L << " " << R << " " << RK[c] << " " << pre <<endl;
		int suf = ask_suf(root[L-1],root[R],RK[c]);
//		cout <<L << " " << R << " "  << RK[c] << " " << suf <<endl;
		if(pre==-INF) return Q(suf,RK[c])<=mid;
		if(suf==INF) return Q(pre,RK[c])<=mid;
		return max(Q(suf,RK[c]),Q(pre,RK[c]))<=mid;
	}
	signed main(){
		read(n);read(m);
		for(int i = 1;i<=n;i++){
			read(S[i]);
			a[i] = S[i];
		}
		init();
		GuanYuHDeXianDuanShu::build(1,1,n);
        root[1] = build(1,n);
		for(int i = 1;i<=n;i++){
            if(!root[i]){
                root[i] = build(tree[root[i-1]]);
            }
            modify(root[i],RK[i]);
		}
		while(m--){
			int a,b,c,d;
			read(a);read(b);read(c);read(d);
			int l = 0,r = b-a+1,ans;
			while(l<=r){
				int mid = (l+r)>>1;
				if(check(a,b,c,d,mid)){
					r = mid-1;
					ans = mid;
				}else l = mid+1;
			}
			// if(m%1000==0) cerr << "1000 is OK!\n";
			write(min(ans,d-c+1),endl);
		}
		return 0;
	}
}
signed main(){
//	freopen("str10.in","r",stdin);
//	freopen("str10.txt","w",stdout);
//	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int T = 1;
//	gtx::read(T);
	while(T--) gtx::main();
	return 0;
}

詳細信息


Pretests


Final Tests

Test #1:

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

input:

300 300
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbaaaaaaabbaaaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaabaaababaaaaaaaaaaaa...

output:

167
195
126
180
165
180
169
134
128
200
182
222
130
213
186
136
206
155
201
175
164
138
141
202
160
147
192
169
164
207
177
168
203
213
158
196
156
201
194
179
155
129
181
183
170
204
177
176
192
132
185
185
191
212
199
183
221
178
201
212
139
156
147
150
179
140
143
181
213
138
178
126
205
202
169
...

result:

ok 300 numbers

Test #2:

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

input:

3000 3000
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa...

output:

2192
2174
2152
2232
2235
2223
2242
2183
2192
2224
2215
2236
2222
2171
2210
2178
2176
2194
2157
2206
2247
2190
2233
2158
2235
2156
2236
2172
2157
2167
2186
2221
2243
2218
2243
2233
2187
2191
2188
2245
2180
2209
2207
2208
2205
2154
2236
2181
2176
2151
2194
2208
2237
2174
2172
2231
2151
2193
2221
2194
...

result:

ok 3000 numbers

Test #3:

score: 10
Accepted
time: 10ms
memory: 14204kb

input:

3000 3000
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa...

output:

2181
2200
2196
2226
2241
2159
2199
2186
2170
2209
2197
2167
2241
2152
2175
2215
2164
2167
2155
2154
2194
2160
2212
2183
2235
2160
2179
2214
2202
2151
2169
2233
2228
2177
2188
2161
2197
2183
2158
2161
2157
2245
2246
2209
2163
2200
2156
2161
2172
2193
2161
2222
2241
2183
2223
2239
2215
2159
2153
2190
...

result:

ok 3000 numbers

Test #4:

score: 10
Accepted
time: 10ms
memory: 17468kb

input:

3000 3000
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa...

output:

2225
2226
2240
2220
2247
2236
2211
2244
2203
2194
2179
2196
2205
2176
2238
2209
2152
2238
2153
2157
2239
2173
2246
2208
2235
2164
2165
2201
2204
2178
2152
2245
2213
2191
2188
2187
2152
2175
2226
2175
2232
2226
2187
2167
2219
2246
2217
2196
2223
2235
2226
2181
2245
2192
2176
2247
2181
2180
2183
2241
...

result:

ok 3000 numbers

Test #5:

score: 10
Accepted
time: 944ms
memory: 84696kb

input:

100000 100000
aaaaaaawaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaajbaaaaaaaaaaxaaaaasaaaaaaaaaabaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaaaaaaaaaabtaaaaabaaaabaaaaaaaaaaaabaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaaaaaaaaaaaaaaaaaaaaaaabkaaaaaaaaaabbaaaaaaaaaaaxaaaaaa...

output:

27
2
30
4
29
22
21
31
7
12
25
40
27
33
3
16
38
13
12
38
25
25
31
10
3
32
28
15
29
14
21
21
38
18
53
38
10
17
12
10
15
30
25
28
31
18
9
15
26
26
44
6
27
53
6
37
17
16
28
19
15
4
19
35
30
25
16
35
34
14
4
14
24
30
22
48
14
51
27
16
10
40
36
33
32
29
13
28
56
19
27
34
21
19
16
11
5
22
41
23
21
42
8
41
...

result:

ok 100000 numbers

Test #6:

score: 10
Accepted
time: 911ms
memory: 85536kb

input:

100000 100000
aaaaaapaaaaaaaaaaaaapaaaaaaaaaybaaaaaaaaaaaaabaaaaaaaaaaaaaaapavaaaaggaaabababaubaabaaaaaaaaalaaaaaaaaajaaaaaaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaabbaaaaaaaaaabaaaaaaaaaaaaaaaaaazaaaaoaeaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaa...

output:

37
42
22
17
47
12
55
10
23
34
36
57
27
42
19
38
21
56
21
13
40
10
5
14
51
4
22
21
33
19
20
14
26
23
15
27
32
46
17
26
24
15
28
11
14
10
12
26
23
44
27
6
12
55
16
21
10
21
23
36
26
21
8
14
11
10
31
17
29
18
19
65
28
21
25
56
41
24
31
37
26
22
12
22
48
16
22
15
30
22
37
17
17
6
32
17
43
13
19
22
11
35...

result:

ok 100000 numbers

Test #7:

score: 10
Accepted
time: 941ms
memory: 87168kb

input:

100000 100000
aaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaabaabaaaaaabaaaaaaaaaaaaaaaaaaaaeaaaabaaaaaaaaaaqabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaapaaaaaaaafraaaaaaabaaaaaaaaaaabaaaaaaaaaaaqaaabaaaaaaaaaaabaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaqbaaaaaaaaaaaaaaaaa...

output:

5
12
9
36
29
21
28
22
46
5
26
35
9
60
28
11
30
11
20
22
37
54
13
22
26
11
10
26
14
11
30
35
23
20
13
31
19
19
43
19
36
15
36
34
12
16
50
38
15
15
8
24
18
20
14
26
62
22
19
14
41
20
3
25
37
23
23
10
15
8
25
21
20
28
12
30
28
9
31
21
46
31
24
28
19
27
9
41
50
39
16
10
25
18
17
30
44
17
40
8
66
7
23
44...

result:

ok 100000 numbers

Test #8:

score: 10
Accepted
time: 955ms
memory: 86784kb

input:

100000 100000
aaavaaaaaaaaaaaaaabaaaaaaaaaaaataabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaxaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaavaaabaaaaabaaaaaaaaaaaaatabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaaaaaabaaaaanawaaaaaaaaaaaaalaaaaaaaaaaaaaaaaaaaab...

output:

18
37
25
26
16
14
12
18
19
19
39
38
22
22
39
7
23
21
16
24
16
30
36
26
28
27
33
30
15
19
19
29
34
34
30
28
23
27
26
40
35
8
27
10
25
25
22
22
30
8
12
14
7
31
16
30
20
20
21
24
15
19
9
36
45
6
24
32
29
20
16
11
28
26
14
26
12
6
51
25
51
27
27
27
41
29
22
8
9
19
17
13
26
15
26
21
22
26
26
16
31
28
40
...

result:

ok 100000 numbers

Test #9:

score: 10
Accepted
time: 918ms
memory: 86028kb

input:

100000 100000
aaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaaabaaaaaaabaaaaaaalaaaaaaaaaaaaaaaaaaaavaaaaaaaakabaaaaafawbaaaaaaaaaataaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaabaaaaaaaaaaaaaaaaawaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaoaaaaaaaiaaaaaaaaaaaaaaaaa...

output:

47
21
21
21
48
61
7
35
25
16
17
21
30
21
13
16
22
17
7
25
25
24
34
25
11
31
30
18
8
45
34
52
8
22
50
24
44
45
43
29
59
40
12
14
30
26
35
34
50
29
21
11
40
15
30
51
35
45
22
5
20
16
18
20
34
56
50
45
15
41
5
50
16
19
20
14
20
33
10
32
31
15
15
31
36
23
3
30
47
43
43
21
16
14
31
22
8
63
50
13
35
26
24...

result:

ok 100000 numbers

Test #10:

score: 10
Accepted
time: 947ms
memory: 87668kb

input:

100000 100000
aaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaadbaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaalraaaakaaaaaaaaawaaaaaaaaaaaaaaaaaaaaaaajaaaaaaaaaaaaaaanbaaaaaaaaaaaadaaaaaataabaaaaaaabaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaa...

output:

9
23
37
20
33
25
32
55
36
16
35
23
22
15
11
21
18
33
15
29
18
21
26
49
12
25
3
16
44
31
13
16
11
23
15
10
53
28
9
22
18
17
23
38
39
29
54
37
22
11
16
26
21
24
12
31
21
33
20
21
35
25
5
4
23
54
19
20
20
16
21
15
50
22
29
29
9
30
5
27
32
29
32
24
25
14
7
21
22
7
11
35
11
24
18
33
9
23
36
20
35
9
13
27...

result:

ok 100000 numbers