brute force data structures divide and conquer hashing math *2500

Please click on ads to support us..

C++ Code:

#include<bits/stdc++.h>
#define M 5001
using namespace std;
mt19937_64 rnd(time(0));
int n,a[300001];
long long h[300001],base[300001],pre[300001];
inline int read()
{
	int k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
void solve(){
	int n; n=read();
	for(int i = 1; i <= n; ++i){
		a[i]=read();
		h[i] = rnd();
		base[i] = base[i - 1] ^ h[i];
	}
	int ans = 0;
	for(int i = 1, j = 1; i <= n; ++i){
		pre[i] = pre[i - 1] ^ h[a[i]];
		if(a[i] == 1) j = 1, ++ans;
		else{
			j = max(j, a[i]);
			if(i >= j && (pre[i] ^ pre[i - j]) == base[j]) ++ans;
		}
	}
	reverse(a + 1, a + n + 1);
	for(int i = 1, j = 1; i <= n; ++i){
		pre[i] = pre[i - 1] ^ h[a[i]];
		if(a[i] == 1) j = 1;
		else{
			j = max(j, a[i]);
			if(i >= j && (pre[i] ^ pre[i - j]) == base[j]) ++ans;
		}
	}
	printf("%d\n",ans);
}
int main()
{
	solve();
	return 0;
}


Comments

Submit
0 Comments
More Questions

714B - Filya and Homework
31A - Worms Evolution
1691A - Beat The Odds
433B - Kuriyama Mirai's Stones
892A - Greed
32A - Reconnaissance
1236D - Alice and the Doll
1207B - Square Filling
1676D - X-Sum
1679A - AvtoBus
1549A - Gregor and Cryptography
918C - The Monster
4B - Before an Exam
545B - Equidistant String
1244C - The Football Season
1696B - NIT Destroys the Universe
1674A - Number Transformation
1244E - Minimizing Difference
1688A - Cirno's Perfect Bitmasks Classroom
219A - k-String
952A - Quirky Quantifiers
451B - Sort the Array
1505H - L BREAK into program
171E - MYSTERIOUS LANGUAGE
630D - Hexagons
1690D - Black and White Stripe
1688D - The Enchanted Forest
1674C - Infinite Replacement
712A - Memory and Crow
1676C - Most Similar Words