QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#267242#7748. Karshilov's Matching Problem IImanizareWA 118ms109780kbC++142.5kb2023-11-27 02:59:162023-11-27 02:59:16

Judging History

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

  • [2024-08-25 20:42:18]
  • hack成功,自动添加数据
  • (/hack/789)
  • [2023-11-27 02:59:16]
  • 评测
  • 测评结果:WA
  • 用时:118ms
  • 内存:109780kb
  • [2023-11-27 02:59:16]
  • 提交

answer

#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
#define F first
#define S second 
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define PII pair<pii , pii>
#define int long long 
#define ld long double
#define sz(v) (int)v.size()
using namespace std ;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn =1e6 + 10 , N = 3e5 + 10  , inf = 1e18 , mod = 1000000007 ;
int  n,  a[maxn] ,lcp[maxn] , w[maxn] , sm[maxn] , z[maxn] , z2[maxn] , id[maxn] ,b[maxn] , fen[maxn]  ; 
int ans[maxn] ;
vector <int> G[maxn] , vec[maxn], vec2[maxn];

void upd(int x, int val){
	x++;
	while(x <= n+1){
		fen[x] += val ;
		x += x&-x ;
	}
}
int que(int x){
	int sum =0 ;
	x++;
	while(x){
		sum += fen[x] ;
		x-=x&-x ;
	}
	return sum ;
}

void dfs(int v ,int p = 0){
	sm[v] += w[v] ;
	for(int u : G[v]){
		sm[u] += sm[v] ;
		dfs(u) ;
	}
}

signed main() {
    ios::sync_with_stdio(0);cin.tie(0);
	int  q ;
	cin >> n >> q; 
	string s ,t ;
	cin >> s >> t ;
	for(int i = 1; i <= n ;i++){
		cin >> w[i]; 
	}
	int T = 0 ;
	G[0].pb(1);
	for(int i = 1 ; i < sz(s) ; i++){
		while(T!=0 && s[T] != s[i]){
			T = lcp[T-1] ;
		}
		if(s[T] == s[i])T++;
		lcp[i] = T ;
		G[lcp[i]].pb(i+1);
	}
	dfs(0) ;
	int l = 0 ,  r= 0  ;
	for(int i = 1 ; i < n ; i++){
		if(i < r){
			z[i] = min(r-i , z[i-l]) ;
		}
		while(i+z[i] < n && s[i+z[i]] == s[z[i]])z[i]++;
		if(i+z[i] > r){
			l = i , r = i+z[i] ; 
		}
	}
	l = 0 , r = 0 ;
	for(int i =0 ; i < n ; i++){
		if(i < r){
			z2[i] = min(r-i , z[i-l]) ;
		}
		while(i+z2[i] < n && t[i+z2[i]] == s[z2[i]])z2[i]++;
		if(i+z2[i] > r){
			l = i , r = i + z2[i] ;
		}
	}
	for(int i =1 ; i<= q; i++){
		cin >> a[i] >> b[i] ;a[i]--;b[i]--;
		vec[a[i]].pb(i);
	}
	set <pii> se ;
	for(int i =0 ; i < n ; i++){
		for(int x : vec[i]){
			se.insert({b[x] , x}) ;
		}
		while(sz(se) && (*se.begin()).F < i+z2[i]){
			id[(*se.begin()).S] = i ; 
			se.erase(se.begin()) ;
		}
	}
	for(int i = 2; i <= n ;i++){
		w[i] += w[i-1] ;
		sm[i] += sm[i-1] ;
	}
	for(int i = 1; i <= q; i++){
		if(id[i]+z2[id[i]]-1 <= b[i] || id[i] > b[i]){
			id[i] = 0;
		}
		if(id[i]!=0){
			ans[i] = sm[b[i]-id[i]+1] ;
			vec2[id[i]].pb(i);
		}
	}
	for(int i = n-1 ; i >= 0 ; i--){
		upd(i+z2[i]-1 , w[z2[i]]);
		for(int x : vec[i]){
			ans[x] += que(b[x]) ;
		}
		for(int x : vec2[i]){
			ans[x] -= que(b[x]) ;
		}
	}
	for(int i = 1; i <= q; i++){
		cout << ans[i] << "\n" ;
	}
	cout << "\n" ;
}
/*


*/

详细

Test #1:

score: 100
Accepted
time: 4ms
memory: 87860kb

input:

8 5
abbabaab
aababbab
1 2 4 8 16 32 64 128
1 1
2 3
3 5
4 7
1 8

output:

1
3
3
16
38


result:

ok 5 lines

Test #2:

score: 0
Accepted
time: 8ms
memory: 87488kb

input:

15 4
heheheheehhejie
heheheheheheheh
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
2 3
4 8
2 6
1 15

output:

3
13
13
174


result:

ok 4 lines

Test #3:

score: -100
Wrong Answer
time: 118ms
memory: 109780kb

input:

150000 150000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

108147037823514
221878585246974
454923840877556
439870231572735
147699781056151
88695249853257
351159618462315
58850354020997
65408467971919
270158033672354
197732558443069
298193894693053
239511187032650
27723187381239
407964204985141
268053430937402
32001154335879
104397581378589
44074926058619
78...

result:

wrong answer 3rd lines differ - expected: '455339807727642', found: '454923840877556'