bzoj 4866: [Ynoi2017]由乃的商场之旅
设第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]由乃的商场之旅的更多相关文章
- [bzoj4866] [Ynoi2017]由乃的商场之旅
来自FallDream的博客,未经允许,请勿转载,谢谢, 由乃有一天去参加一个商场举办的游戏.商场派了一些球王排成一行.每个人面前有几堆球.说来也巧,由乃和你一样,觉得这游戏很无聊,于是决定换一个商场 ...
- 【莫队】bzoj4866: [Ynoi2017]由乃的商场之旅
莫队的一些套路 Description 由乃有一天去参加一个商场举办的游戏.商场派了一些球王排成一行.每个人面前有几堆球.说来也巧,由乃和你 一样,觉得这游戏很无聊,于是决定换一个商场.另一个商场是D ...
- BZOJ.3598.[SCOI2014]方伯伯的商场之旅(贪心 数位DP)
题目链接 先考虑,对于确定的一个数,怎样移动代价最少(或者移到哪个位置最优)? 假设我们都移到下标\(1\)位置(设集合点为\(1\)),那么移动到下标\(2\)与\(1\)相比代价差为:\(下标&l ...
- BZOJ4866 Ynoi2017由乃的商场之旅(莫队)
显然能重排为回文串相当于出现次数为奇数的字母不超过一个.考虑莫队,问题在于如何统计添加/删除一位的贡献.将各字母出现次数奇偶性看做二进制数,做一个前缀和一个后缀和.在右端添加一位时,更新区间的前缀.后 ...
- 【BZOJ4866】[YNOI2017] 由乃的商场之旅(莫队)
点此看题面 大致题意: 给你一个字符串,每次给你一段区间,问这段区间内有多少个字符串在重新排列后可以变成一个回文串. 关于莫队 详见这篇博客:莫队算法学习笔记(一)--普通莫队. 关于回文 要使一个字 ...
- bzoj 3598: [Scoi2014]方伯伯的商场之旅【数位dp】
参考了这个http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好写 大概思想就是先计算出把所有石子都合并到1位置的代价,这样显然有一些是不优的,然 ...
- bzoj 3598 [Scoi2014]方伯伯的商场之旅——数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 TJ:https://www.cnblogs.com/Zinn/p/9351218.h ...
- 「SCOI2014」方伯伯的商场之旅 解题报告
「SCOI2014」方伯伯的商场之旅 我一开始的想法会被两个相同的集合位置去重给搞死,不过应该还是可以写的,讨论起来老麻烦. 可以先钦定在\(1\)号点集合,然后往后调整一部分. 具体一点,通过前缀和 ...
- 「SCOI2014」方伯伯的商场之旅
「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...
随机推荐
- HDU - 4454: Stealing a Cake (圆上三分)
pro:给定一个蛋糕,一个矩阵房子,一只蚂蚁.最开始三者两两相离,问蚂蚁触摸到蛋糕后再触摸矩阵的最短距离.结果保留两位小数,坐标的绝对值<1e4: sol:由于坐标不大,而且精度要求不高,不难想 ...
- django额外参数的传递和url命名
django额外参数的传递 path方法:path(route, view, kwargs=None, name=None) path方法可以传递入一个额外参数的字典参数(kwarg),字典里的值就会 ...
- Go Example--定时器
package main import ( "fmt" "time" ) func main() { //定时器2s timer1 := time.NewTim ...
- 【JVM】参数配置
[一]JVM参数配置释意 编号 配置项 例子 含义 备注 1 -Xmx -Xmx20m java应用最大可用内存为20M 整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固 ...
- C++中的显式类型转换
一.学习总结 1.C++中额外提供的类型转换有 (1) reinterpret_cast: 格式:reinterpret_cast<type-id> (expression)①type-i ...
- nginx http2 push 试用
nginx 已经很早就支持http2,今天证书过期,重新申请了一个,同时测试下http2 的push 功能 环境准备 证书 这个结合自己的实际去申请,我使用免费的letsencrypt,支持泛域名证书 ...
- revit api 使用过滤器
1. Door在Revit里面的element类型是FamilyInstance. 2. Door在Revit里面的category类型是OST_Doors. 3. 想要过滤特定类型的element需 ...
- Flex Cairngorm框架知识整理
简介: Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex RIA开发的最好框架之一.使用Cairngorm框架可以大大提高开发和维护的效率. Ca ...
- Zookeeper权限acl,acl的构成 scheme与id
一.ACl(accerss control lists)权限控制 1 针对节点可以设置相关读写权限,目的为了保障数据安全性 2.权限permissions可以指定不同的权限范围以及角色 二.ACL命 ...
- 全文检索Solr集成HanLP中文分词
以前发布过HanLP的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在 ...