제출 #607596

#제출 시각아이디문제언어결과실행 시간메모리
607596PietraLottery (CEOI18_lot)C++14
45 / 100
997 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] ; 

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 ;

	for(int i = 1 ; i + l - 1 <= n ; i++){ 
		for(int j = 1 ; j + l - 1 <= n ; j++){
			if(i == j) continue ; 
			ll v1 = pref[i+l-1] ; 
			ll v2 = pref[j+l-1] ; 
			if(i - 1 >= 1) v1 = (v1 - pref[i-1] + mod)%mod ; 
			if(j - 1 >= 1) v2 = (v2 - pref[j-1] + mod)%mod ; 
			v1 = (v1*inv[i])%mod, v2 = (v2*inv[j])%mod ; 
			if(v1 == v2) dist[i][j] = dist[j][i] = 1 ;  
		}
	}

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

	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...