QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#840523 | #9952. JUMPin' JUMP UP!!! | chenxinyang2006 | AC ✓ | 230ms | 6148kb | C++23 | 2.7kb | 2025-01-02 19:38:08 | 2025-01-02 19:38:16 |
Judging History
answer
#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
//#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;
template <class T>
void chkmax(T &x,T y){
if(x < y) x = y;
}
template <class T>
void chkmin(T &x,T y){
if(x > y) x = y;
}
inline int popcnt(int x){
return __builtin_popcount(x);
}
inline int ctz(int x){
return __builtin_ctz(x);
}
/*ll power(ll p,int k = mod - 2){
ll ans = 1;
while(k){
if(k % 2 == 1) ans = ans * p % mod;
p = p * p % mod;
k /= 2;
}
return ans;
}*/
int TEST,n,m,q;
char s[100005],t[100005],str[200005];
int z[200005];
void calc(int L){
int l = 1,r = 0;
rep(i,2,L){
if(i <= r) z[i] = min(r - i + 1,z[i - l + 1]);
else z[i] = 0;
while(i + z[i] <= L && str[1 + z[i]] == str[i + z[i]]) z[i]++;
if(i + z[i] - 1 > r){
l = i;
r = i + z[i] - 1;
}
}
}
int lcp[100005],lcs[100005],sum[100005],ans[100005];
int getsum(int l,int r){
if(l > r) return 0;
return sum[r] - sum[l - 1];
}
void solve(){
scanf("%d%d%d",&n,&m,&q);
scanf("%s",s + 1);
scanf("%s",t + 1);
rep(i,1,m) str[i] = t[i];
calc(m);
int per = m;
rep(i,2,m) if(z[i] == m - i + 1 && m % (i - 1) == 0) chkmin(per,i - 1);
int sz = 0;
rep(i,1,per) str[++sz] = t[i];
rep(i,1,n) str[++sz] = s[i];
calc(sz);
rep(i,1,n) lcp[i] = min(per,z[per + i]);
sz = 0;
per(i,per,1) str[++sz] = t[i];
per(i,n,1) str[++sz] = s[i];
calc(sz);
per(i,n,1) lcs[i] = min(per,z[per + n - i + 1]);
rep(i,per + 1,m) sum[i] = sum[i - 1] + (s[i] != s[i - per]);
fill(ans,ans + n + 1,-1);
rep(p,1,n){
int pl = p - min(per - 1,lcs[p - 1]),pr = p + lcp[p] - per;
// printf("%d->[%d,%d]\n",p,pl,pr);
rep(k,pl,pr){
assert(ans[k] == -1);
ans[k] = p - k;
}
}
rep(i,1,q){
int pos;
ll len;
scanf("%d%lld",&pos,&len);
if(getsum(pos + per,pos + m - 1)){
printf("0\n");
continue;
}
if(ans[pos] == -1){
printf("0\n");
continue;
}
int dd = ans[pos];
if(dd) dd = per - dd;
/* rep(ss,0,m - 1) printf("%c",s[pos + ss]);
printf("\n");
printf("dd=%d\n",dd);*/
len -= dd;
if(len < 0){
printf("0\n");
}else{
printf("%lld\n",len / per + (dd > 0));
}
}
}
int main(){
#ifdef cxy
freopen("test.in","r",stdin);
#endif
scanf("%d",&TEST);
while(TEST--) solve();
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3888kb
input:
1 4 2 3 abcd ba 1 2 2 2 3 2
output:
1 0 0
result:
ok 3 tokens
Test #2:
score: 0
Accepted
time: 230ms
memory: 6148kb
input:
1126 100 19 100 bzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzb bzbzbzbzbzbzbzbyydz 56 76480443552173389 38 692816130192550219 33 703112329902236202 74 338839552028748732 5 231782307290688600 11 676202903706926230 23 327149191556259670 46 89836370...
output:
4025286502745967 36464006852239485 37005912100117695 17833660633092038 12199068804773085 35589626510890854 17218378502961036 47282300283677508 49424514696701914 718335379405514 21864557806215529 34660711060158649 10954133132284723 4309231433797528 51886468906311730 8242825662888107 52502379720138545...
result:
ok 1000000 tokens
Extra Test:
score: 0
Extra Test Passed