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\) 堆的石 ...
随机推荐
- Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)
昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发. 题目还是满漂亮的. 尚有几题待补. C .Complete Naebbirac's sequence 题意:给定N个数,他们在1到K ...
- 陕西师范第七届K题----动态规划
ps: 自己的方法绝对是弱爆了 肯定存在更优的方法 O(n^3)复杂度 暴力求解的.. 链接:https://www.nowcoder.com/acm/contest/121/K来源:牛客网 柯怡最近 ...
- inner join 与一般笛卡尔积的区别
inner join 与一般笛卡尔积的区别:inner join是笛卡尔积的特殊形式.如果有表a和表b,表a有m条记录,表b有n条记录,则一般笛卡尔积后得到的记录条数是m*n条,记录之间的组合是随意的 ...
- ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)
Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...
- 内存池技术(UVa 122 Tree on the level)
内存池技术就是创建一个内存池,内存池中保存着可以使用的内存,可以使用数组的形式实现,然后创建一个空闲列表,开始时将内存池中所有内存放入空闲列表中,表示空闲列表中所有内存都可以使用,当不需要某一内存时, ...
- 实验吧—Web——WP之 因缺思汀的绕过
首先打开解题链接查看源码: 查看源码后发现有一段注释: <!--source: source.txt-->这点的意思是:原来的程序员在写网页时给自己的一个提醒是源码在这个地方,我们要查看时 ...
- 《DSP using MATLAB》Problem 5.11
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- python------面向对象介绍之经典类与新式类的继承顺序
一. 经典类与新式类的继承顺序 1 class A: def __init__(self): print("A") class B(A): def __init__(self): ...
- JSP中页面向Action传递参数的几种方式
<form name="ThisForm" method="POST" action="index.jsp"> form是表单, ...
- IntelliJ IDEA备忘
IntelliJ IDEA生成get/set方法的快捷键 IntelliJ IDEA生成get/set有2种方式,alt+enter.alt+insert.下面分别介绍这2种方式快速生成get与set ...