显然能重排为回文串相当于出现次数为奇数的字母不超过一个。考虑莫队,问题在于如何统计添加/删除一位的贡献。将各字母出现次数奇偶性看做二进制数,做一个前缀和一个后缀和。在右端添加一位时,更新区间的前缀、后缀集合,将后缀集合中合法的统计入答案即可。另三种更新类似。复杂度O(26*n√n)。

  但是这个毒瘤题他不仅卡常还卡空间。捣鼓了半天最后欢快地弃疗了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 60010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,block,a[N],pre[N],suf[N];
unsigned int ans[N];
unsigned short cntpre[<<],cntsuf[<<];
char s[N];
struct data
{
int k,l,r,i;
bool operator <(const data&a) const
{
return k<a.k||k==a.k&&(k&?r>a.r:r<a.r);
}
}q[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4866.in","r",stdin);
freopen("bzoj4866.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();block=*sqrt(n);
scanf("%s",s+);
for (int i=;i<=n;i++) a[i]=<<s[i]-'a';
for (int i=;i<=n;i++) pre[i]=pre[i-]^a[i];
for (int i=n;i>=;i--) suf[i]=suf[i+]^a[i];
for (int i=;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].k=q[i].l/block,q[i].i=i;
sort(q+,q+m+);
int l=,r=;
for (int i=;i<=m;i++)
{
ans[q[i].i]=ans[q[i-].i];
while (r<q[i].r)
{
++r,cntpre[pre[r-]]++,cntsuf[suf[r+]]++;
ans[q[i].i]+=cntpre[pre[r]];
for (int j=;j<;j++) ans[q[i].i]+=cntpre[pre[r]^(<<j)];
}
while (l>q[i].l)
{
--l,cntpre[pre[l-]]++,cntsuf[suf[l+]]++;
ans[q[i].i]+=cntsuf[suf[l]];
for (int j=;j<;j++) ans[q[i].i]+=cntsuf[suf[l]^(<<j)];
}
while (r>q[i].r)
{
ans[q[i].i]-=cntpre[pre[r]];
for (int j=;j<;j++) ans[q[i].i]-=cntpre[pre[r]^(<<j)];
cntpre[pre[r-]]--,cntsuf[suf[r+]]--,r--;
}
while (l<q[i].l)
{
ans[q[i].i]-=cntsuf[suf[l]];
for (int j=;j<;j++) ans[q[i].i]-=cntsuf[suf[l]^(<<j)];
cntpre[pre[l-]]--,cntsuf[suf[l+]]--,l++;
}
}
for (int i=;i<=m;i++) printf("%u\n",ans[i]);
return ;
}

BZOJ4866 Ynoi2017由乃的商场之旅(莫队)的更多相关文章

  1. [bzoj4866] [Ynoi2017]由乃的商场之旅

    来自FallDream的博客,未经允许,请勿转载,谢谢, 由乃有一天去参加一个商场举办的游戏.商场派了一些球王排成一行.每个人面前有几堆球.说来也巧,由乃和你一样,觉得这游戏很无聊,于是决定换一个商场 ...

  2. 【莫队】bzoj4866: [Ynoi2017]由乃的商场之旅

    莫队的一些套路 Description 由乃有一天去参加一个商场举办的游戏.商场派了一些球王排成一行.每个人面前有几堆球.说来也巧,由乃和你 一样,觉得这游戏很无聊,于是决定换一个商场.另一个商场是D ...

  3. 【BZOJ4810】[Ynoi2017]由乃的玉米田 bitset+莫队

    [BZOJ4810][Ynoi2017]由乃的玉米田 Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.由乃认为玉米田不美,所 ...

  4. 【BZOJ4866】[YNOI2017] 由乃的商场之旅(莫队)

    点此看题面 大致题意: 给你一个字符串,每次给你一段区间,问这段区间内有多少个字符串在重新排列后可以变成一个回文串. 关于莫队 详见这篇博客:莫队算法学习笔记(一)--普通莫队. 关于回文 要使一个字 ...

  5. bzoj 4866: [Ynoi2017]由乃的商场之旅

    设第i个字母的权值为1<<i,则一个可重集合可以重排为回文串,当且仅当这个集合的异或和x满足x==x&-x,用莫队维护区间内有多少对异或前缀和,异或后满足x==x&-x,这 ...

  6. BZOJ4810 Ynoi2017由乃的玉米田(莫队+bitset)

    多组询问不强制在线,那么考虑莫队.bitset维护当前区间出现了哪些数,数组记录每个数的出现次数以维护bitset.对于乘法,显然应有一个根号范围内的因子,暴力枚举即可.对于减法,a[i]-a[j]= ...

  7. BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...

  8. 【BZOJ4810】[YNOI2017] 由乃的玉米田(莫队+bitset)

    点此看题面 大致题意: 给你一段序列,每次询问一段区间内是否存在两个数的差或和或积为\(x\). 莫队算法 看到区间询问+可以离线,首先想到了莫队啊. 但是,在较短的时间内更新信息依然比较难以实现. ...

  9. BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法

    加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...

随机推荐

  1. 20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

    20145226夏艺华<网络对抗>第一次实验拓展:shellcode注入+return-to-libc shellcode注入实践 编写shellcode 编写shellcode已经在之前 ...

  2. cocos2d-x3.7 cclabel文字破碎,异常,变乱

    效果图如下: 无论是按钮(control button),还是普通的label都有小概率出现这种情况. 该问题发现于cocos2d-x3.7 原因: 在3.x中使用ttfconfig创建的label, ...

  3. Android事件分发机制浅析(1)

    本文来自网易云社区 作者:孙有军 事件机制是Android中一个比较复杂且重要的知识点,比如你想自定义拦截事件,或者某系组件中嵌套了其他布局,往往会出现这样那样的事件冲突,坑爹啊!!事件主要涵盖onT ...

  4. JS dataTables

    原文地址: http://www.cnblogs.com/haogj/archive/2011/03/04/1971328.html   数据来源有四种: 1. 网页DOM对象 $(document) ...

  5. 2019年猪年海报PSD模板-第一部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1i7bIzPRTX0OMbHFWnqURWQ                        

  6. Unity制作人物头像小图标和小地图

    人物头像的制作: 在场景中添加人物模型和环境模型 设置人物的layer为Player 在主摄像机的基础上,新建一个次摄像机并将摄像机镜头对准人物面部,调整至合适大小. 设置次摄像机 culling m ...

  7. 【system.array】使用说明

    对象:system.array 说明:提供一系列针对数组类型的操作 目录: 方法 返回 说明 system.array.join( array, separator ) [String]  将数组转换 ...

  8. 【循环控制器】-(针对中间部分要循环的场景,相当于loadrunner的action部分)

    一般使用 setup线程组 + teardown组 针对中间要循环的部分   使用循环处理器    单独循环中间的部分,相当于loadrunner的action部分

  9. DataSet转化为DataTable

    . DataTable dt = ds.Tables[]; . DataTable dt = dao.FillTables("GetOptions_DKI_City_HCPName" ...

  10. C#通过gridview导出excel

    [CustomAuthorize]        public FileResult ExportQuestionCenterExcel(SearchBaseQuestion search)      ...