来自FallDream的博客,未经允许,请勿转载,谢谢,


由乃有一天去参加一个商场举办的游戏。商场派了一些球王排成一行。每个人面前有几堆球。说来也巧,由乃和你一样,觉得这游戏很无聊,于是决定换一个商场。另一个商场是Deus的,他看到由乃来了,于是想出了一个更有趣的游戏:写数据结构题这个题是这样的:
我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真。我本来是无病呻吟,漫无目的的吐露爱情---现在这些漂泊不定的鸟儿有地方栖息了,你可以从信里看出来。拿去吧---由于不是出自真心,话就说得格外动听,拿去吧,就这么办吧...由于世界会在7月20日完结,作为救世主,间宫卓司要在19日让
所有人回归天空现在已经是19日傍晚,大家集合在C栋的天台上,一共n个人在他们面前,便是终之空,那终结的天空
回归天空是一件庄重的事情,所以卓司决定让大家分批次进行,给每个人给了一个小写字母'a'->'z'作为编号一个区间的人如果满足他们的编号重排之后可以成为一个回文串,则他们可以一起回归天空,即这个区间可以回归天空由于卓司是一个喜欢妄想的人,他妄想了m个区间,每次他想知道每个区间中有多少个子区间可以回归天空因为世界末日要来了,所以卓司的信徒很多
由乃天天做数据结构已经快恶心死了,于是让您帮她做当然,您天天做数据结构题,肯定也觉得恶心死了,不过可爱即正义!所以这个题还是要做的~
 
n,m<=60000  2s,166MB
 
把a-z编号成2的次幂,求出前缀异或和,那么对于每一个位置,和他能组成可行区间的前缀异或和和它最多只有一个二进制位不同。
很容易想到莫队算法+枚举二进制位查询的方法,复杂度$O(26n\sqrt{n})$  并不能通过这道题。
但是有个treat,就是发现不同的前缀异或和不是很多,所以考虑离散,预处理每一个能转移到的所有状态,这样就把转移的复杂度从$O(26)$降到了$O(玄学)$  233 而且居然跑的飞快,直接跑到了rank5  但是估计是可以被叉掉的。
但是有没有科学的做法?当然有。对于每个点,预处理它到所在的块的右端点的答案。莫队的时候从右端点开始扩展。最后,枚举左边那个不完整的部分统计答案即可。
块的大小是k的情况下,复杂度是$\frac{n^{2}26}{k}+nk$ , k=$\sqrt{26n}$的时候复杂度是$O(n\sqrt{26n})$ 然而跑了20s快t了..
加上前面的那个优化,可以在5s左右跑完
乱搞
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<map>
  6. #define rint register int
  7. #define MN 60000
  8. #define ll long long
  9. using namespace std;
  10. inline int read()
  11. {
  12. int x = , f = ; char ch = getchar();
  13. while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
  14. while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
  15. return x * f;
  16. }
  17.  
  18. map<int,int> mp;
  19. ll ans=,Ans[MN+];
  20. bool b[MN+];
  21. int n,m,now=,dn=,p[],block[MN+],size,L,R,ha[MN+],cnt=,f[MN+],head[MN+];
  22. char st[MN+];
  23. struct ques{int l,r,id;}q[MN+];
  24. struct edge{int to,next;}e[MN*+];
  25. bool cmp(ques x,ques y){return block[x.l]==block[y.l]?x.r<y.r:x.l<y.l;}
  26. inline void ins(int f,int t){if(!t)return;e[++cnt]=(edge){t,head[f]};head[f]=cnt;}
  27.  
  28. inline void Ins(int num,int ad)
  29. {
  30. for(int i=head[ha[num]];i;i=e[i].next)
  31. ans+=f[e[i].to]*ad;
  32. ans+=ad*f[ha[num]];
  33. }
  34.  
  35. int main()
  36. {
  37. n=read();m=read();p[]=;size=sqrt(n);
  38. for(rint i=;i<=n;++i) block[i]=(i-)/size+;
  39. for(rint i=;i<;++i) p[i]=p[i-]<<;
  40. scanf("%s",st+);mp[]=++dn;
  41. for(rint i=;i<=n;++i) ha[i]=ha[i-]^p[st[i]-'a'],!mp[ha[i]]?mp[ha[i]]=++dn:b[i]=;
  42. for(rint j=;j<;++j) ins(,mp[p[j]]);ha[]=;
  43. for(int i=;i<=n;++i)
  44. {
  45. int now=mp[ha[i]];
  46. if(!b[i])for(int j=;j<;++j) ins(now,mp[ha[i]^p[j]]);
  47. ha[i]=now;
  48. }
  49. for(rint i=;i<=m;++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
  50. sort(q+,q+m+,cmp);L=R=,++f[],++f[ha[]],ans=;
  51. for(rint i=;i<=m;++i)
  52. {
  53. while(R<q[i].r) ++R,Ins(R,),++f[ha[R]];
  54. while(L>q[i].l) --L,Ins(L-,),++f[ha[L-]];
  55. while(L<q[i].l) --f[ha[L-]],Ins(L-,-),++L;
  56. while(R>q[i].r) --f[ha[R]],Ins(R,-),--R;
  57. Ans[q[i].id]=ans;
  58. }
  59. for(int i=;i<=m;++i) printf("%lld\n",Ans[i]);
  60. return ;
  61. }
科学 但是成功贴着时限跑过去
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #define rint register int
  6. #define MN 60000
  7. #define MB 1300
  8. #define ll long long
  9. using namespace std;
  10. inline int read()
  11. {
  12. int x = , f = ; char ch = getchar();
  13. while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
  14. while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
  15. return x * f;
  16. }
  17.  
  18. ll ans=,Ans[MN+],Pre[MN+];
  19. int n,m,now=,dn=,p[],block[MN+],size,R,ha[MN+],tot,rt[MB+];
  20. unsigned short f[<<];
  21. char st[MN+];
  22. struct ques{int l,r,id;}q[MN+];
  23. bool cmp(ques x,ques y){return block[x.l]==block[y.l]?x.r<y.r:x.l<y.l;}
  24.  
  25. inline void Ins(int num,int ad)
  26. {
  27. if(num>n) return;
  28. f[num=ha[num]]+=ad;
  29. for(int i=;i<;++i) f[num^p[i]]+=ad;
  30. }
  31.  
  32. ll Bl(int l,int r)
  33. {
  34. ll ans2=;
  35. for(int i=l;i<=r;++i)
  36. Ins(i-,),ans2+=f[ha[i]];
  37. for(int i=l;i<=r;++i) Ins(i-,-);
  38. return ans2;
  39. }
  40.  
  41. int main()
  42. {
  43. n=read();m=read();p[]=;size=sqrt(*n);tot=(n-)/size+;
  44. for(rint i=;i<=n;++i) block[i]=(i-)/size+;
  45. for(rint i=;i<;++i) p[i]=p[i-]<<;
  46. scanf("%s",st+);
  47. for(rint i=;i<=n;++i) ha[i]=ha[i-]^p[st[i]-'a'];
  48. for(int i=;i<=tot;++i)
  49. {
  50. rt[i]=min(n,i*size);ans=;
  51. for(int j=rt[i];j>rt[i-];--j)
  52. Ins(j,),ans+=f[ha[j-]],Pre[j]=ans;
  53. for(int j=rt[i];j>rt[i-];--j) Ins(j,-);
  54. }
  55. for(rint i=;i<=m;++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
  56. sort(q+,q+m+,cmp);
  57. for(rint i=,last=;i<=m;++i)
  58. {
  59. if(block[q[i].l]!=last)
  60. {
  61. for(int i=rt[last];i<R;++i) Ins(i,-);
  62. last=block[q[i].l];Ins(R=rt[last],);ans=(++R<=n);
  63. }
  64. if(block[q[i].l]==block[q[i].r]) Ins(rt[last],-),Ans[q[i].id]=Bl(q[i].l,q[i].r),Ins(rt[last],);
  65. else
  66. {
  67. while(R<q[i].r) ++R,Ins(R-,),ans+=f[ha[R]];
  68. ll ans2=;Ins(R,);Ins(rt[last],-);
  69. for(int j=q[i].l;j<=rt[last];++j) ans2+=f[ha[j-]];
  70. Ans[q[i].id]=ans+Pre[q[i].l]+ans2;
  71. Ins(R,-);Ins(rt[last],);
  72. }
  73. }
  74. for(int i=;i<=m;++i) printf("%lld\n",Ans[i]);
  75. return ;
  76. }

把它们揉一起  飞快

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<map>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define rint register int
  7. #define MN 60000
  8. #define MB 1300
  9. #define ll long long
  10. using namespace std;
  11. inline int read()
  12. {
  13. int x = , f = ; char ch = getchar();
  14. while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
  15. while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
  16. return x * f;
  17. }
  18.  
  19. bool b[MN+];
  20. map<int,int> mp;
  21. ll ans=,Ans[MN+],Pre[MN+];
  22. int n,m,now=,dn=,p[],block[MN+],size,R,ha[MN+],tot,rt[MB+],head[MN+],cnt=;
  23. unsigned short f[MN+];
  24. char st[MN+];
  25. struct ques{int l,r,id;}q[MN+];
  26. struct edge{int to,next;}e[MN*+];
  27. bool cmp(ques x,ques y){return block[x.l]==block[y.l]?x.r<y.r:x.l<y.l;}
  28. inline void ins(int f,int t){if(!t)return;e[++cnt]=(edge){t,head[f]};head[f]=cnt;}
  29. inline void Ins(int num,int ad)
  30. {
  31. if(num>n) return;
  32. f[num=ha[num]]+=ad;
  33. for(int i=head[num];i;i=e[i].next) f[e[i].to]+=ad;
  34. }
  35.  
  36. ll Bl(int l,int r)
  37. {
  38. ll ans2=;
  39. for(int i=l;i<=r;++i)
  40. Ins(i-,),ans2+=f[ha[i]];
  41. for(int i=l;i<=r;++i) Ins(i-,-);
  42. return ans2;
  43. }
  44.  
  45. int main()
  46. {
  47. n=read();m=read();p[]=;size=sqrt(*n);tot=(n-)/size+;
  48. for(rint i=;i<=n;++i) block[i]=(i-)/size+;
  49. for(rint i=;i<;++i) p[i]=p[i-]<<;
  50. scanf("%s",st+);mp[]=++dn;
  51. for(rint i=;i<=n;++i) ha[i]=ha[i-]^p[st[i]-'a'],!mp[ha[i]]?mp[ha[i]]=++dn:b[i]=;
  52. for(rint j=;j<;++j) ins(,mp[p[j]]);ha[]=;
  53. for(int i=;i<=n;++i)
  54. {
  55. int now=mp[ha[i]];
  56. if(!b[i])for(int j=;j<;++j) ins(now,mp[ha[i]^p[j]]);
  57. ha[i]=now;
  58. }
  59. for(int i=;i<=tot;++i)
  60. {
  61. rt[i]=min(n,i*size);ans=;
  62. for(int j=rt[i];j>rt[i-];--j)
  63. Ins(j,),ans+=f[ha[j-]],Pre[j]=ans;
  64. for(int j=rt[i];j>rt[i-];--j) Ins(j,-);
  65. }
  66. for(rint i=;i<=m;++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
  67. sort(q+,q+m+,cmp);
  68. for(rint i=,last=;i<=m;++i)
  69. {
  70. if(block[q[i].l]!=last)
  71. {
  72. for(int i=rt[last];i<R;++i) Ins(i,-);
  73. last=block[q[i].l];Ins(R=rt[last],);ans=(++R<=n);
  74. }
  75. if(block[q[i].l]==block[q[i].r]) Ins(rt[last],-),Ans[q[i].id]=Bl(q[i].l,q[i].r),Ins(rt[last],);
  76. else
  77. {
  78. while(R<q[i].r) ++R,Ins(R-,),ans+=f[ha[R]];
  79. ll ans2=;Ins(R,);Ins(rt[last],-);
  80. for(int j=q[i].l;j<=rt[last];++j) ans2+=f[ha[j-]];
  81. Ans[q[i].id]=ans+Pre[q[i].l]+ans2;
  82. Ins(R,-);Ins(rt[last],);
  83. }
  84. }
  85. for(int i=;i<=m;++i) printf("%lld\n",Ans[i]);
  86. return ;
  87. }

[bzoj4866] [Ynoi2017]由乃的商场之旅的更多相关文章

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

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

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

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

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

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

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

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

  5. 「SCOI2014」方伯伯的商场之旅 解题报告

    「SCOI2014」方伯伯的商场之旅 我一开始的想法会被两个相同的集合位置去重给搞死,不过应该还是可以写的,讨论起来老麻烦. 可以先钦定在\(1\)号点集合,然后往后调整一部分. 具体一点,通过前缀和 ...

  6. 「SCOI2014」方伯伯的商场之旅

    「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...

  7. [BZOJ3598][SCOI2014]方伯伯的商场之旅(数位DP,记忆化搜索)

    3598: [Scoi2014]方伯伯的商场之旅 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 449  Solved: 254[Submit][Sta ...

  8. 洛谷P3286 [SCOI2014]方伯伯的商场之旅

    题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...

  9. 【bzoj3598】: [Scoi2014]方伯伯的商场之旅

    Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...

随机推荐

  1. 07-TypeScript的For循环

    在传统的JavaScript中,关于循环,可以有两种方式,一种是forEach,一种是for. forEach的用法如下: var sarr=[1,2,3,4]; sarr.desc="he ...

  2. Mego(1) - NET中主流ORM框架性能对比

    从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...

  3. plsql启动提示监听服务无法连接

    话说现在用的oracle少了,本人菜鸟一个,但是我真心的没有感觉到它用的少了,今天入了一个新项目,数据库使用的还是oracle,经理二话不说的给了一些东西,说了让一句你把环境啥地 配置一下,然后走人了 ...

  4. 请求方式:request和 get、post、put

    angular 的 http 多了 Request, Headers, Response ,这些都是游览器的"新特性" Fetch API. Fetch API 和以前的 xmlh ...

  5. kubernetes入门(03)kubernetes的基本概念

    一.Pod 在Kubernetes集群中,Pod是创建.部署和调度的基本单位.一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个应用的容器.在同一个Pod内部,多个容器共享存储.网络IP,以 ...

  6. 解决编写的 html 乱码问题

  7. JAVAFX-5 开发应用

    fx 属性与布局 属性与布局是一个具备gui开发能力的开发者,快速进入开发必备的知识储备,下面简单说一说常用的属性,与布局 颜色 颜色 在 javafx.scene.paint.Color 类中提供了 ...

  8. Python基础数据类型之字典

      基础数据类型之字典 ps:数据类型划分:可变数据类型和不可变数据类型. 不可变数据类型:元组(tupe).布尔值(bool).整数型(int).字符串(str).不可变数据类型也称为可哈希. 可变 ...

  9. 2018年html5入门到精通教程电子书百度云盘下载共22本

    名称 查看 <HTML5启动和运行>(HTML5.Up.and.Running)扫描版[PDF] 下载 <Pro HTML5 Performance>(Pro HTML5 Pe ...

  10. 记录项目中用的laypage分页代码

    最终才觉得,好记性不如烂笔头,毕竟已经不是刚毕业时候的巅峰了,精力有所下降,很多时候记不住东西. 参考url:http://www.layui.com/laypage/ 直接上代码了 <scri ...