제출 #607602

#제출 시각아이디문제언어결과실행 시간메모리
607602PietraLottery (CEOI18_lot)C++14
65 / 100
1992 ms65536 KiB
// seq ai com n numeros 
// a dist de 2 intervalos e a qtd de caras diferentes ai+x e ai+y
// dois intervalos são k similares se a dist entre eles é no max k 
// p cada inicio diga qts intervalos ele tem tal q a dist eh menor que k 
// n pequeno acha a dist de cada um pros outros n^2 
// k == 0 qts intervalos iguais? -> freq dos valores 
// p cada cara qual o igual a ele mais prox dele 
// consigo descobrir em o(n) qts caras sao iguais a mim? 
// dado um i e um l vc sabe dizer qual a pos ele vai estar num vetor j?

#include<bits/stdc++.h>
#define ll long long
using namespace std ; 

const int prime = 37 ; 
const int mod = 1e9 + 7 ; 
const int maxn = 1e4 + 5 ; 

int n, l, v[maxn], dist[maxn][maxn], k, q ;  
ll pot[maxn], inv[maxn], pref[maxn], val[maxn] ; 

void solve(){
	
	for(int i = 1 ; i <= n ; i++){
		for(int j = 1 ; j <= n ; j++){ // dist de i p j 
			if(i == j || i + l - 1 > n || j + l - 1 > n) continue ; 
			int ctr = 0 ; 
			for(int k = 0 ; k < l ; k++) if(v[i+k] != v[j+k]) ctr++ ; 
			dist[i][j] = dist[j][i] = ctr ; 
		}
	}

}

ll exp(ll a, ll b){
	ll ans = 1 ; 
	while(b){
		if(b&1) ans = (ans*a)%mod ; 
		a = (a*a)%mod ; 
		b >>= 1 ; 
	}
	return ans ; 
}

void solve_hash(){

	pot[0] = 1LL ; 

	for(int i = 1 ; i < maxn ; i++) pot[i] = (pot[i-1]*prime)%mod ; 

	inv[0] = 1LL ; inv[1] = exp(prime, mod-2) ; 
    
    for(int i = 2 ; i < maxn ; i++) inv[i] = (inv[i-1]*inv[1])%mod ; 

	for(int i = 1 ; i <= n ; i++) pref[i] = (pref[i-1] + (v[i]*pot[i]*1LL)%mod)%mod ;

	vector<ll> vals ; 

	for(int i = 1 ; i + l - 1 <= n ; i++){ 
		ll v1 = pref[i+l-1] ; 
		if(i - 1 >= 1) v1 = (v1 - pref[i-1] + mod)%mod ; 
		v1 = (v1*inv[i])%mod ; 
		vals.push_back(v1) ; val[i] = v1 ; 
	}

	sort(vals.begin(), vals.end()) ; 

	for(int i = 1 ; i + l - 1 <= n ; i++){
		int l =  lower_bound(vals.begin(), vals.end(), val[i]) - vals.begin() ; 
		int r =  upper_bound(vals.begin(), vals.end(), val[i]) - vals.begin() ;
		cout << (r - l - 1) << " " ; 
	}

	cout << "\n" ; 

}

int main(){

	ios_base::sync_with_stdio(false) ; cin.tie(NULL) ; 

	cin >> n >> l ; 

	for(int i = 1 ; i <= n ; i++) cin >> v[i] ;

	// for(int i = 1  ; i <= n ; i++){
	// 	for(int j = 1 ; j <= n ; j++){
	// 		cout << dist[i][j] <<" " ; 
	// 	}
	// 	cout << "\n" ; 
	// }   

    cin >> q ; 
    cin >> k ; 
    
    if(q == 1 && !k){
    	solve_hash() ;
    	exit(0) ; 
    } 

    solve() ;
    
    for(int i = 1 ; i + l - 1 <= n ; i++){
       	int ct = 0 ; 
      	for(int j = 1 ; j + l - 1 <= n ; j++) if(i != j && dist[i][j] <= k) ct++ ; 
      	cout << ct << " " ; 
    }
    cout << "\n" ;

    for(int i = 1 ; i < q ; i++){
    	cin >> k ; 
    	for(int i = 1 ; i + l - 1 <= n ; i++){
         	int ct = 0 ; 
         	for(int j = 1 ; j + l - 1 <= n ; j++) if(i != j && dist[i][j] <= k) ct++ ; 
         	cout << ct << " " ; 
        }
        cout << "\n" ; 
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...