Ispitamo binarni signal, predstavljen nizom od \(n\) binarnih vrednosti (0
za
uključeno, 1
za isključeno).
Treba odrediti broj uzastopnih podnizova signala čiji je XOR svih
elemenata tačno 1
.
Sa standardnog ulaza se učitava ceo broj \(n\) (\(1 < n < 10^5\)), a zatim, u narednoj liniji, i \(n\) vrednosti \(a_i\) (\(a_i \in \{0, 1\}, 0 \leq i < n\)).
Na standardni izlaz ispisati broj uzastopnih podnizova čiji je XOR
svih elemenata tačno 1
.
5 1 0 1 1 0
8
Podnizovi čija je vrednost XOR-a 1
:
[1]
- pozicija \(0\);[1]
- pozicija \(2\);[1]
- pozicija \(3\);[1, 0]
- od pozicije \(0\) do pozicije \(1\);[0, 1]
- od pozicije \(1\) do pozicije \(0\);[1, 0]
- od pozicije \(3\) do pozicije \(4\);[1, 0, 1, 1]
- od pozicije \(0\) do pozicije \(3\);[1, 0, 1, 1, 0]
- od pozicije \(0\) do pozicije \(4\);4 1 1 0 1
6
U ovom bloku se opisuje glavno rešenje zadatka.
#include <bits/stdc++.h>
using namespace std;
int count_segments(const vector<int> &a)
{
const int n = a.size();
<int, int> num_prefix;
map[0] = 1;
num_prefix
int count = 0, prefix_xor = 0;
for (int i = 0; i < n; i++) {
^= a[i];
prefix_xor += num_prefix[prefix_xor ^ 1];
count [prefix_xor]++;
num_prefix}
return count;
}
int main()
{
::sync_with_stdio(false);
ios.tie(nullptr);
cin
int n; cin >> n;
<int> a(n);
vectorfor(int i = 0; i < n; i++) {
>> a[i];
cin }
<< count_segments(a) << endl;
cout }
#include <bits/stdc++.h>
using namespace std;
int count_segments(const vector<int> &a)
{
const int n = a.size();
int count = 0;
for (int i = 0; i < n; i++) {
int curr_xor = 0;
for (int j = i; j < n; j++) {
^= a[j];
curr_xor if (curr_xor == 1) {
++;
count}
}
}
return count;
}
int main()
{
::sync_with_stdio(false);
ios.tie(nullptr);
cin
int n; cin >> n;
<int> a(n);
vectorfor(int i = 0; i < n; i++) {
>> a[i];
cin }
<< count_segments(a) << endl;
cout }
#include <iostream>
#include <vector>
using namespace std;
int count_segments(const vector<int> &a)
{
const int n = a.size();
int count = 0;
int even = 0, odd = 0;
for (int i = 0; i < n; i++) {
if (a[i] == 0) {
++;
even} else {
int tmp = even;
= odd;
even = tmp + 1;
odd }
+= odd;
count }
return count;
}
int main()
{
int n; cin >> n;
<int> a(n);
vectorfor (int i = 0; i < n; i++) {
>> a[i];
cin }
<< count_segments(a) << endl;
cout
return 0;
}