QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#840341#9952. JUMPin' JUMP UP!!!chenxinyang2006RE 0ms3840kbC++232.4kb2025-01-02 17:20:582025-01-02 17:21:00

Judging History

This is the latest submission verdict.

  • [2025-01-02 17:21:00]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 3840kb
  • [2025-01-02 17:20:58]
  • Submitted

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];
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]);
	chkmin(q,1000);
	rep(i,1,q){
		int pos;
		ll len;
		scanf("%d%lld",&pos,&len);
		if(getsum(pos + per,pos + m - 1)){
			printf("0\n");
			continue;
		}
		int dd = -1;
		rep(d,0,per - 1){
			if(d && lcs[pos + d - 1] < d) continue;
			if(lcp[pos + d] < per - d) continue;
			dd = d;
		}
		if(dd == -1){
			printf("0\n");
			continue;
		}
		len -= dd;
		if(len < 0) printf("0\n");
		else printf("%lld\n",len / per + 1);
	}
}

int main(){
#ifdef cxy
	freopen("test.in","r",stdin);
#endif
	scanf("%d",&TEST);
	while(TEST--) solve();
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3840kb

input:

1
4 2 3
abcd
ba
1 2
2 2
3 2

output:

1
0
0

result:

ok 3 tokens

Test #2:

score: -100
Runtime Error

input:

1126
100 19 100
bzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzbzbzbzbzbzbyydzbzbzb
bzbzbzbzbzbzbzbyydz
56 76480443552173389
38 692816130192550219
33 703112329902236202
74 338839552028748732
5 231782307290688600
11 676202903706926230
23 327149191556259670
46 89836370...

output:

4025286502745968
36464006852239486
37005912100117695
17833660633092039
12199068804773084
35589626510890854
17218378502961035
47282300283677508
49424514696701913
718335379405515
21864557806215529
34660711060158650
10954133132284724
4309231433797527
51886468906311731
8242825662888107
52502379720138545...

result: