Beer Mugs(异或前缀和)

题目描述

你一个长度为n的字符串,求一个连续最长的一个区间,这个区间里面的字符可以任意顺序排列,最终使得这个区间形成一个回文;那么求这个区间的最长长度;

题解

这个是典型的用异或来维护区间的奇偶性

首先想一下这个题如果每一个字母出现的次数都是偶数次那么一定是可以的,但是还有一种情况那就是有一个字母出现的次数是奇数次

首先考虑出现的次数都是偶数次,那么偶数次,首先应该想到的是异或为0,比如1,2,1,2这四个数异或起来就是0,因为x^x=0,x^0=x

那么可以用for循环枚举一个字母这种情况就是有一个奇数的情况。这个用到了异或前缀和

Code

#include<iostream>
#include<algorithm>
#include<cstring> 
#include<map>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e6+100;
unordered_map<int,int> mp;
char a[maxn];
int n;
int b[maxn];
int sum[maxn];
int main(){
    cin>>n;
    cin>>a+1;    
    mp[0]=1;
    int ans=0,t=0;
    for(int i=1;i<=n;i++){
        t^=1<<(a[i]-'a');
        if(!mp.count(t)){
            mp[t]=i+1;    
        }
        else{
            ans=max(ans,i-mp[t]+1);
        }
        for(int j=0;j<20;j++){
              if(mp.count(t^(1<<j))){
                    ans=max(ans,i-mp[t^(1<<j)]+1);
            }
        }
    }
    cout<<ans<<endl;

}

 

posted @ 2021-09-08 12:50  lipu123  阅读(71)  评论(0)    收藏  举报