Beer Mugs(思维)

题目描述
Damian is a beer mug collector. His collection fills most of the shelves in his vintage wooden cabinet where all mugs are proudly displayed. The mugs are of various brands. There might be, and often are, more mugs of the same brand in the collection.
Mugs on a shelf in Damian’s collection always form a single symmetric row. Specifically, the symmetry of the row means that the sequence of particular mug brands in the row is the same when the mugs are being admired one by one from left to right and when the mugs are being admired one by one from right to left. There is still one empty shelf in the cabinet and Damian looks for an opportunity to fill it with a new set of mugs.
The widely recognized Mastodon brewery (admired for its Woolly Mammoth beer) organizes annually the so-called beer season. Participants of the season are engaged in daily beer rewing activities and are rewarded each day by a special collector mug. Each day in the season is assigned a particular mug brand. The mug brands for all days in the season are known in advance, some brands may appear repeatedly in the season.
A participant may subscribe for the whole season or just for a part of the season. However, all days of his or her participation have to be in one uninterrupted sequence of days, a participant cannot leave the season and then come back again after some days of absence.
Damian is keen to take part in the beer season. He decided that the set of mugs he brings home should be suited for his display without adding or removing any mug, and that the set should be as big as possible.
Given the list of mug brands provided by the brewery for all days in the beer season, find the size of the biggest set of mugs suitable for Damian’s display which can be obtained by subscribing to some appropriately chosen part of the beer season.

输入
The first input line contains integer N (1 < N ≤ 300 000) the number of days in the brewery beer season. The next line contains N characters representing the list of all beer mug brands offered in the season, day by day. The list is naturally ordered from the first day to the last day of the season. Each brand is coded by a single lower case letter, from ’a’ to ’t’. The list contains no blanks.

输出
Print a single integer representing the size of the biggest set of mugs which Damian can bring home from the brewery beer season and which is suitable, without changes, for his collection display.

样例输入
6
abcabc

样例输出
6

思路
本体要求一个子串使得能组成回文串,因此可以用求最大01字串的思路,将字母转化为二进制数字求异或前缀和,若出现多次相同数字,则证明该点与前次出现的点能组成回文串。

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N= 300005;
const int INF=0x3f3f3f3f;
const int mod=1000000007;
typedef pair<int,int>P;

char s[N];
int n;
unordered_map<int,int>mp;

int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    int now=0,ans=0;
    mp[0]=0;
    for(int i=1;i<=n;i++)
    {
        now^=(1<<(s[i]-'a'));
        if(mp.count(now)) ans=max(i-mp[now],ans);
        else mp[now]=i;
        for(int j=0;j<=20;j++)
        {
            int y=1<<j;
            if(mp.count(now^y))ans=max(i-mp[now^y],ans);
        }
    }
    printf("%d\n",ans);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值