Problem
给出一个长度n 的序列,求有多少个连续子序列,满足所有的元素出现的次数为偶数。
Problem
思路比较巧妙,可以归类为 “状态基dp”
- 统计每一种颜色出现次数的状态,0表示出现偶数次,1表示出现奇数次,用21位二进制数表示
- 每次到达一种状态,就把之前到达这种状态的次数累加到答案中
(之所以到达某种之前到达的状态,明显这个点到之前到达该状态的点的这一段区间内所有元素出现次数为偶数)
Code
const int N = 3e6 + 6;
int a[N];
int st, cnt[N];
int main()
{
IOS;
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
ll ans = 0;
cnt[0] = 1;//从1~i所有出现过的元素都有偶数个
for (int i = 1; i <= n; i++)
{
st ^= (1 << a[i]);
ans += cnt[st];
cnt[st]++;
}
cout << ans << endl;
return 0;
}