设第i个字母的权值为1<<i,则一个可重集合可以重排为回文串,当且仅当这个集合的异或和x满足x==x&-x,用莫队维护区间内有多少对异或前缀和,异或后满足x==x&-x,这样端点移动的代价为字符集大小+1=27,因此时间复杂度为$O(27n\sqrt{m})$

#include<cstdio>
#include<cmath>
#include<algorithm>
char buf[],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
typedef unsigned int u32;
const int P=,N=;
int n,q,xs[N][];
int hx[P][],idp=;
int getid(int x){
int w=x%P;
while(hx[w][]){
if(hx[w][]==x)return hx[w][];
if((w+=)>=P)w-=P;
}
hx[w][]=x;
return hx[w][]=++idp;
}
u32 as[N],pos[N],B,ans=,t[N*];
struct Q{
int l,r,id;
}qs[N];
bool operator<(Q a,Q b){
if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
if(a.r!=b.r)return (a.r<b.r)^(pos[a.l]&);
return a.id<b.id;
}
void ins(int*x){
for(int i=;i<=;++i)ans+=t[x[i]];
++t[x[]];
}
void del(int*x){
--t[x[]];
for(int i=;i<=;++i)ans-=t[x[i]];
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
n=_();q=_();
B=(n+)/sqrt(q+)+;
for(int i=;i<=n;++i)pos[i]=i/B;
while(*ptr<'a')++ptr;
for(int i=;i<=n;++i)xs[i][]=xs[i-][]^<<*ptr++-'a';
for(int i=;i<=n;++i){
for(int j=;j<;++j)xs[i][j]=xs[i][]^<<j;
}
for(int i=;i<=n;++i){
for(int j=;j<=;++j)xs[i][j]=getid(xs[i][j]);
}
for(int i=;i<q;++i){
qs[i].l=_()-;
qs[i].r=_();
qs[i].id=i;
}
std::sort(qs,qs+q);
int L=,R=;
for(int i=;i<q;++i){
int l=qs[i].l,r=qs[i].r;
while(L>l)ins(xs[--L]);
while(R<r)ins(xs[++R]);
while(L<l)del(xs[L++]);
while(R>r)del(xs[R--]);
as[qs[i].id]=ans;
}
for(int i=;i<q;++i)printf("%u\n",as[i]);
return ;
}

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

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

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

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

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

  3. BZOJ.3598.[SCOI2014]方伯伯的商场之旅(贪心 数位DP)

    题目链接 先考虑,对于确定的一个数,怎样移动代价最少(或者移到哪个位置最优)? 假设我们都移到下标\(1\)位置(设集合点为\(1\)),那么移动到下标\(2\)与\(1\)相比代价差为:\(下标&l ...

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

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

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

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

  6. bzoj 3598: [Scoi2014]方伯伯的商场之旅【数位dp】

    参考了这个http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好写 大概思想就是先计算出把所有石子都合并到1位置的代价,这样显然有一些是不优的,然 ...

  7. bzoj 3598 [Scoi2014]方伯伯的商场之旅——数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 TJ:https://www.cnblogs.com/Zinn/p/9351218.h ...

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

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

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

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

随机推荐

  1. lvm创建 及 扩空 等相关

    1.先对磁盘进行LVM 设置 2.pvcreate  物理卷的创建 pvcreate /dev/### 3.vgcreate 物理卷组的创建 vgcreate  vg_name  /dev/###  ...

  2. java-多态中成员访问特点-父类引用指向子类对象

    多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...

  3. js添加select中option

    1.js代码 $("#year").append("<option value="+value的值+">"+内容+"& ...

  4. MVVM在WPF中应用(1)

    在软件行业浸润了这么多年,第一次在MES的工厂里从事软件开发. 在这里的感觉就是安静.宽松,比在那些专门以软件为主的企业中轻松自在.在这里的第一个项目是关于数据的导入和导出,还有数据的比较这些功能. ...

  5. java黑魔法-反射机制-01

    在java的帮助文档中,java.lang包中有一个Class类,注意这里的"C“是大写,所以这个不是表示类的声明,而是一个真正的类.在java的帮助文档中,这样定义的Class类: pub ...

  6. C# 获取机器码

    using System.Runtime.InteropServices; using System.Management; using System; public class HardwareIn ...

  7. JavaScript Closures 闭包

    在一些编程语言中, 当我们执行完成function中的局部代码仅在函数执行期间可运行. 但是JS 事不一样的 闭包总结来说, 就是innerFunction 总是有使用outer function 的 ...

  8. 如何使用百度bae部署web项目

    百度bae提供了支持各种开发环境的的应用引擎,包括node.js.php.java等,而且还免费提供了一定容量的mysql.mongodb.redis等数据库,所以,可以把它当作一个云服务器来使用.而 ...

  9. web.xml启动spring详解

    https://blog.csdn.net/king_cannon_fodder/article/details/79328576 详细介绍:https://www.cnblogs.com/wkrbk ...

  10. Gitlab备份与恢复、迁移与升级

    0.Gitlab安装 1.安装和配置必要的依赖关系 在CentOS7,下面的命令将在系统防火墙打开HTTP和SSH访问.   yum install curl openssh-server postf ...