莫队的一些套路

Description

由乃有一天去参加一个商场举办的游戏。商场派了一些球王排成一行。每个人面前有几堆球。说来也巧,由乃和你
一样,觉得这游戏很无聊,于是决定换一个商场。另一个商场是Deus的,他看到由乃来了,于是想出了一个更有趣
的游戏:写数据结构题这个题是这样的:
 
我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真。我本来是无病呻吟
,漫无目的的吐露爱情---现在这些漂泊不定的鸟儿有地方栖息了,你可以从信里看出来。拿去吧---由于不是出自
真心,话就说得格外动听,拿去吧,就这么办吧...由于世界会在7月20日完结,作为救世主,间宫卓司要在19日让
所有人回归天空现在已经是19日傍晚,大家集合在C栋的天台上,一共n个人在他们面前,便是终之空,那终结的天
 
回归天空是一件庄重的事情,所以卓司决定让大家分批次进行,给每个人给了一个小写字母'a'->'z'作为编号一个
区间的人如果满足他们的编号重排之后可以成为一个回文串,则他们可以一起回归天空,即这个区间可以回归天空
由于卓司是一个喜欢妄想的人,他妄想了m个区间,每次他想知道每个区间中有多少个子区间可以回归天空因为世
界末日要来了,所以卓司的信徒很多
 
由乃天天做数据结构已经快恶心死了,于是让您帮她做当然,您天天做数据结构题,肯定也觉得恶心死了,不过可
爱即正义!所以这个题还是要做的~

Input

第一行两个数n,m
之后一行一个长为n的字符串,代表每个人的编号
之后m行每行两个数l,r代表每次卓司妄想的区间
n,m<=60000

Output

m行,每行一个数表示答案

Sample Input

6 6
zzqzzq
1 6
2 4
3 4
2 3
4 5
1 1

Sample Output

16
4
2
2
3
1

题目分析

应该是一类常见套路:考虑每加入一个元素对于已知区间的贡献。

那么这里把每个字母看成$2^i$,先预处理出每一个位置的异或前缀和,莫队查询时答案增上全为偶次的字符+枚举为奇数的字母的贡献即可。

注意莫队中加入与删除操作的顺序,这个有些时候是会相互影响的。

然后用unsigned short int卡空间,就好了。

  1. #include<bits/stdc++.h>
  2. #define S(p) cnt[tmp^(1<<p)]
  3. #define Add(val) tmp=c[val],nw+=cnt[tmp],nw+=S(0)+S(1)+S(2)+S(3)+S(4)+S(5)+S(6)+S(7)+S(8)+S(9)+S(10)+S(11)+S(12)+S(13)+S(14)+S(15)+S(16)+S(17)+S(18)+S(19)+S(20)+S(21)+S(22)+S(23)+S(24)+S(25),++cnt[tmp]
  4. #define Del(val) tmp=c[val],--cnt[tmp],nw-=cnt[tmp],nw-=S(0)+S(1)+S(2)+S(3)+S(4)+S(5)+S(6)+S(7)+S(8)+S(9)+S(10)+S(11)+S(12)+S(13)+S(14)+S(15)+S(16)+S(17)+S(18)+S(19)+S(20)+S(21)+S(22)+S(23)+S(24)+S(25)
  5. const int maxn = ;
  6. const int maxp = ;
  7.  
  8. int blk[maxn],size;
  9. struct QRs
  10. {
  11. int l,r,id;
  12. bool operator < (QRs a) const
  13. {
  14. return blk[l]==blk[a.l]?(blk[l]&?r < a.r:r > a.r):blk[l] < blk[a.l];
  15. }
  16. }q[maxn];
  17. int n,m,c[maxn],ans[maxn],L,R,nw,tmp;
  18. unsigned short cnt[maxp];
  19. char s[maxn];
  20.  
  21. int read()
  22. {
  23. char ch = getchar();
  24. int num = , fl = ;
  25. for (; !isdigit(ch); ch=getchar())
  26. if (ch=='-') fl = -;
  27. for (; isdigit(ch); ch=getchar())
  28. num = (num<<)+(num<<)+ch-;
  29. return num*fl;
  30. }
  31. int main()
  32. {
  33. n = read(), m = read(), scanf("%s",s+);
  34. size = std::min(*(int)sqrt(n+0.5), n)+;
  35. for (int i=; i<=n; i++) blk[i] = i/size, c[i] = c[i-]^(<<(s[i]-'a'));
  36. for (int i=; i<=m; i++) q[i].l = read()-, q[i].r = read(), q[i].id = i;
  37. std::sort(q+, q+m+);
  38. L = , R = ;
  39. for (int i=; i<=m; i++)
  40. {
  41. while (L > q[i].l) --L, Add(L);
  42. while (R < q[i].r) ++R, Add(R);
  43. while (L < q[i].l) Del(L), ++L;
  44. while (R > q[i].r) Del(R), --R;
  45. ans[q[i].id] = nw;
  46. }
  47. for (int i=; i<=m; i++) printf("%d\n",ans[i]);
  48. return ;
  49. }

END

【莫队】bzoj4866: [Ynoi2017]由乃的商场之旅的更多相关文章

  1. BZOJ4866 Ynoi2017由乃的商场之旅(莫队)

    显然能重排为回文串相当于出现次数为奇数的字母不超过一个.考虑莫队,问题在于如何统计添加/删除一位的贡献.将各字母出现次数奇偶性看做二进制数,做一个前缀和一个后缀和.在右端添加一位时,更新区间的前缀.后 ...

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

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

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

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

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

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

  5. bzoj4810 [Ynoi2017]由乃的玉米田 bitset优化+暴力+莫队

    [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 917  Solved: 447[Submit][Status][Di ...

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

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

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

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

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

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

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

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

随机推荐

  1. HBase中报错 java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString

    Protobuf(全称 Protocol Buffers)是 Google 开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.在 HBase 里面用使用了 Protobu ...

  2. 新的JSON / YAML插件:在JMeter中使用YAML

    在JMS插件从jmeter-plugins.org捐赠给核心JMeter之后,JSON插件在Apache JMeter™版本4中被弃用.现在,我已更新此插件以支持新功能和新功能.在这个新版本中,两个插 ...

  3. Linux —— ps命令

    Ps命令 作用 显示瞬间进程的状态,并不动态连续: 如果想对进程进行实时监控应该用top命令: 对进程的管理,可以使用kill命令发送信号 Ps PID : 运行着的命令的进程编号 TTY : 命令所 ...

  4. BZOJ 4551: [Tjoi2016&Heoi2016]树 并查集(&&图论?)

    反向操作,先把所有的标记都打上(记得统计标记的数目),然后依次撤销,合并到自己的上一个点pre,即fa[u]=getf(pre[u]) #include<cstdio> #include& ...

  5. oracle中CAST函数使用简介【转】

    CAST()函数可以进行数据类型的转换. CAST()函数的参数有两部分,源值和目标数据类型,中间用AS关键字分隔. 以下例子均通过本人测试. 一.转换列或值 语法:cast( 列名/值 as 数据类 ...

  6. netty~引用对象引用

    从InBound里读取的ByteBuf要手动释放,还有自己创建的ByteBuf要自己负责释放.这两处要调用这个release方法. write Bytebuf到OutBound时由netty负责释放, ...

  7. 爬虫(正则)——爬neihan8

    工具:python3 步骤: 1)定义spider类,将具体功能封装成方法 2)观察html页面,写好正确的正则表达式来找到符合规则的文字 3)写一个方法测试一下,保证每写好一个都是对的 4)加入提示 ...

  8. JavaSE---基本网络支持

    1.Java为网络支持提供了java.net包,该包下的URL和URLConnection等类提供了 以编程方式访问WEB服务 的功能: 2.URLDecoder.URLEncoder提供了 普通字符 ...

  9. c#基础 里氏转换

    1.里氏转换1).子类可以赋值给父类2).如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象. 2.子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员. //// 1.里氏转换 ...

  10. git上传布置代码 git优势

    ftp 软件 可直接上传至服务器但不便于管理 Git上传 GitHub/码云/codinghub 登录服务器 ssh 协议登录 ssh 账户@ip地址 密码 mkdir 创建文件 workspace ...