luogu P3604 美好的每一天(莫队+二进制)
这个题还是可以的。
但是卡常卡得我心力憔悴。还是太菜了
我们把一个区间当做一个26位二进制数,每一位代表一个英文,二进制数的每一个位0代表这一位对应的字母出现了偶数次,否则出现了奇数次。
那么一个区间可以升天,当且仅当这个区间对应的二进制数为0或\(x^i\)。
我们用莫队。用\(a[i]\)代表异或前缀和。考虑\([l,r]->[l,r+1]\)贡献的变化,贡献会加上,\(\sum{(a[r+1]==a[x])}+\sum{a[r+1]\oplus{(1<<i)}}(l-1\leq x\leq r,0\leq i\leq 25)\)
我们维护一个\(a[i]\)在当前区间出现次数的桶\(c[i]\)就成了\(c[a[r+1]]+\sum{c[a[r+1]\oplus{(1<<i)}]}(0\leq i\leq 25)\)就可以做了。
卡常居然用到了 unsigned short。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
const int N=60100;
map<int,bool> book;
int n,m,ans[N],tmp,a[N],block[N],pw[30];
unsigned short c[(1<<26)+100];
int cnt,head[N];
struct edge{
int to,nxt;
}e[N*26];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
char s[N];
struct ques{
int l,r,id;
}qu[N];
bool cmp(ques a,ques b){
if(block[a.l]==block[b.l])return a.r<b.r;
else return block[a.l]<block[b.l];
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int main(){
n=read(),m=read();
int Block=sqrt(n);
scanf("%s",s+1);
book[0]=1;
for(int i=1;i<=n;++i){
a[i]=a[i-1]^(1<<(s[i]-'a'));
block[i]=(i-1)/Block+1;
book[a[i]]=1;
}
for(int i=0;i<=n;i++)
for(int j=0;j<=25;j++)
if(book[a[i]^(1<<j)])add(i,a[i]^(1<<j));
for(int i=1;i<=m;++i)qu[i].l=read(),qu[i].r=read(),qu[i].id=i;
sort(qu+1,qu+1+m,cmp);
int l=1,r=0;
c[0]=1;
for(int j=1;j<=m;++j){
while(r<qu[j].r){
r++;
tmp+=c[a[r]];
for(int i=head[r];i;i=e[i].nxt)tmp+=c[e[i].to];
c[a[r]]++;
}
while(l>qu[j].l){
l--;
tmp+=c[a[l-1]];
for(int i=head[l-1];i;i=e[i].nxt)tmp+=c[e[i].to];
c[a[l-1]]++;
}
while(r>qu[j].r){
c[a[r]]--;
tmp-=c[a[r]];
for(int i=head[r];i;i=e[i].nxt)tmp-=c[e[i].to];
r--;
}
while(l<qu[j].l){
c[a[l-1]]--;
tmp-=c[a[l-1]];
for(int i=head[l-1];i;i=e[i].nxt)tmp-=c[e[i].to];
l++;
}
ans[qu[j].id]=tmp;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}
luogu P3604 美好的每一天(莫队+二进制)的更多相关文章
- B 洛谷 P3604 美好的每一天 [莫队算法]
题目背景 时间限制3s,空间限制162MB 素晴らしき日々 我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真.我本来是无病呻吟,漫无目的的吐露爱情---现在这些漂泊不 ...
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...
- 【Luogu P2709 小B的询问】莫队
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
- 【Luogu】P4462异或序列(莫队)
题目链接 观察什么时候x到y之间那一段可以被统计 xorsum[x-1]^xorsum[y]=k xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k 莫队 ...
- luogu 3709 大爷的字符串题 构造 莫队 区间众数
题目链接 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符\(x\),然后把\(x\)从这个区间中删除,你要维护一个集合S 如果\(S\)为空,你\(r ...
- luogu 数列找不同-莫队
https://www.luogu.org/problemnew/show/P3901 了解过莫队的人应该都清楚,莫队是一个优化的暴力,可以在相对暴力比较优的时间中,求出一段序列内的某些性质(例:数字 ...
- 洛谷P3604 美好的每一天(莫队)
传送门 由乃的题还是一如既往的可怕…… 先放上原题解 标解: 一个区间可以重排成为回文串,即区间中最多有一个字母出现奇数次,其他的都出现偶数次 发现这个和 类似 这样如果一个区间的 和为 或者 ...
- Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]
题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天 ...
- luogu 2709小b的询问--莫队
https://www.luogu.org/problemnew/show/P2709 无修改的莫队几乎没有什么太高深的套路,比较模板吧,大多都是在那两个函数上动手脚. 这题询问每一种数字数量的平方和 ...
随机推荐
- 注解实战@Test标签
1.创建一个Maven工程 2.点击java,右键-新建一个类 package com.course.testng; import org.testng.annotations.Test; publi ...
- django-4-模板标签,模板继承
<<<模板标签>>> {% for %}{% endfor %} 循环 {% if %}{% elif %}{% else %}{% endif %} 判断 {% ...
- 2019-03-28 Python SQL 的注释
SQL Server 多行注释 : ctrl + k + c SQL Server 单行注释: -- Python 单行注释:# Python多行注释:''' '''
- 【转】python 关键字
转自:http://www.cnblogs.com/hongten/p/hongten_python_keywords.html python3.3.2中的关键字如下: The following i ...
- 中山纪念中学培训杂题(难的都不在这里面qwq)
来中山纪中半个月了,差不多就要结束了, 写一些之前考试能更正的题解吧,还有一些不是给人做的(比如IOI2018互测.. 备注:我不会的就没有放上来了,所有数学有关的基本上都死了. 所以这里的题目都是相 ...
- 【codeforces 747E】Comments
[题目链接]:http://codeforces.com/problemset/problem/747/E [题意] 给你一个类似递归的结构; 让你把每一层的字符串按照层,一层层地输出出来; 并输出层 ...
- java深克隆与浅克隆
2015.9.19 6:45 星期五 1
- MyEclipse2014高速配置Spring & Spring Testing, Spring AOP简单使用
1.新建项目 2.右击项目,如图,利用myeclipse自己主动导入spring 3.在弹出的对话框中一直next到最后,在最后的页面中勾选Spring Testing,完毕. watermark/2 ...
- JavaFX学习之道:JavaFX之TableView
TableView表 TableColumn列 构建一个表主要有TableView,TableColumn,ObservableList,Bean. 加入列table.getColumns ...
- Android本地存储方案 SharedPreferences
原文地址:http://www.yanwushu.com/post/43.html 存储位置 SharedPreferences数据保存在: /data /data/<package_name& ...