QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#898892 | #6361. 字符串 | gutongxing | 100 ✓ | 955ms | 87668kb | C++20 | 7.0kb | 2025-02-15 09:19:19 | 2025-02-15 09:19:19 |
Judging History
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