BZOJ4866 Ynoi2017由乃的商场之旅(莫队)
显然能重排为回文串相当于出现次数为奇数的字母不超过一个。考虑莫队,问题在于如何统计添加/删除一位的贡献。将各字母出现次数奇偶性看做二进制数,做一个前缀和一个后缀和。在右端添加一位时,更新区间的前缀、后缀集合,将后缀集合中合法的统计入答案即可。另三种更新类似。复杂度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由乃的商场之旅(莫队)的更多相关文章
- [bzoj4866] [Ynoi2017]由乃的商场之旅
来自FallDream的博客,未经允许,请勿转载,谢谢, 由乃有一天去参加一个商场举办的游戏.商场派了一些球王排成一行.每个人面前有几堆球.说来也巧,由乃和你一样,觉得这游戏很无聊,于是决定换一个商场 ...
- 【莫队】bzoj4866: [Ynoi2017]由乃的商场之旅
莫队的一些套路 Description 由乃有一天去参加一个商场举办的游戏.商场派了一些球王排成一行.每个人面前有几堆球.说来也巧,由乃和你 一样,觉得这游戏很无聊,于是决定换一个商场.另一个商场是D ...
- 【BZOJ4810】[Ynoi2017]由乃的玉米田 bitset+莫队
[BZOJ4810][Ynoi2017]由乃的玉米田 Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.由乃认为玉米田不美,所 ...
- 【BZOJ4866】[YNOI2017] 由乃的商场之旅(莫队)
点此看题面 大致题意: 给你一个字符串,每次给你一段区间,问这段区间内有多少个字符串在重新排列后可以变成一个回文串. 关于莫队 详见这篇博客:莫队算法学习笔记(一)--普通莫队. 关于回文 要使一个字 ...
- bzoj 4866: [Ynoi2017]由乃的商场之旅
设第i个字母的权值为1<<i,则一个可重集合可以重排为回文串,当且仅当这个集合的异或和x满足x==x&-x,用莫队维护区间内有多少对异或前缀和,异或后满足x==x&-x,这 ...
- BZOJ4810 Ynoi2017由乃的玉米田(莫队+bitset)
多组询问不强制在线,那么考虑莫队.bitset维护当前区间出现了哪些数,数组记录每个数的出现次数以维护bitset.对于乘法,显然应有一个根号范围内的因子,暴力枚举即可.对于减法,a[i]-a[j]= ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...
- 【BZOJ4810】[YNOI2017] 由乃的玉米田(莫队+bitset)
点此看题面 大致题意: 给你一段序列,每次询问一段区间内是否存在两个数的差或和或积为\(x\). 莫队算法 看到区间询问+可以离线,首先想到了莫队啊. 但是,在较短的时间内更新信息依然比较难以实现. ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法
加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...
随机推荐
- Linux getcwd()的实现
通过getcwd()可以获取当前工作目录. #include <unistd.h> char *getcwd(char *cwdbuf, size_t size); 成功调用返回指向cwd ...
- 注册COM组件cmd(管理员权限)
比如,注册这个很老版本的office组件 C:\Windows\system32>regsvr32 d:\dsoframer.ocx
- 优步UBER司机全国各地奖励政策汇总 (2月15日-2月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Windows运行机理——创建窗口
Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 Windows 窗口在创建之前,其属性必须设定好,所谓属性包括类的名字 ...
- Unity编辑器 - 资源修改立即写入磁盘AssetDataBase.SaveAssets()
Unity编辑器 - 资源修改立即写入磁盘AssetDataBase.SaveAssets() 在编写编辑器时,如果需要修改Unity序列化资源(如Prefab,美术资源,ScriptableObje ...
- openjudge-2的100次方阶乘
开始进行的第一天 #include <stdio.h> #include <string.h> int main() { int n; scanf("%d" ...
- 更新字典 (Updating a Dictionary,UVa12504)
题目描述: 解题思路: 1.根据:和,获得字符串 2.使用两个map进行比较: #include <iostream> #include <algorithm> #includ ...
- FastJson 序列化与反序列化一些说明
最近所属的组需要对接一些征信结构,就涉及到很多中的数据格式,而springmvc中使用的是jackson作为@ResponseBody的依赖jar 但是个人认为fastkson的性能要高于jackso ...
- 百度翻译api 实现简易微信翻译小程序
介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示 使用百度翻译api需要申请 appid 与 key 并在 ap ...
- oraclize预言机资料
oraclize预言机资料 智能合约如何可信的与外部世界交互: https://blog.csdn.net/sportshark/article/details/77477842 国外一篇讲得很详细的 ...