[YNOI2017]由乃的商场之旅 莫队
Description
给你一个字符串,每次给一个询问,问这个区间内有多少个子串经过重新排序后可以变成一个回文串。
Sample Input
6 6
zzqzzq
1 6
2 4
3 4
2 3
4 5
1 1
Sample Output
16
4
2
2
3
1
考虑莫队,因为字符只有26个考虑把他压成二进制。
那么你就可以枚举每个位不一样,统计答案。
然后其实状态数是有限的,于是你预处理一下即可。。。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
int read() {int s = 0, f = 1; char ch = getchar();while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();return s * f;
}
struct hh {int x, id;
} s[61000];
struct node {int l, r, id, bl;
} q[61000]; int m;
int sl[61000], sr[61000];
int sum, ans[61000], S[61000], oo[61000], hg[61000][27];
char ss[61000];bool cmp(node a, node b) {if(a.bl == b.bl) return a.r < b.r;return a.bl < b.bl;
}bool cmp1(hh a, hh b) {return a.x < b.x;}void jiar(int x) {int y = S[x];sl[S[x - 1]]++;sr[y]++;sum += sl[y];for(int i = 1; i <= hg[x][0]; i++) sum += sl[hg[x][i]];
}void jianr(int x) {int y = S[x];sr[y]--;sum -= sl[y];for(int i = 1; i <= hg[x][0]; i++) sum -= sl[hg[x][i]];sl[S[x - 1]]--;
}void jial(int x) {int y = S[x - 1];sl[y]++;sr[S[x]]++;sum += sr[y];for(int i = 1; i <= hg[x - 1][0]; i++) sum += sr[hg[x - 1][i]];
}void jianl(int x) {int y = S[x - 1];sl[y]--;sum -= sr[y];for(int i = 1; i <= hg[x - 1][0]; i++) sum -= sr[hg[x - 1][i]];sr[S[x]]--;
}int main() {int n = read(), m = read();scanf("%s", ss + 1); int p = sqrt(m);for(int i = 1; i <= n; i++) {int o = ss[i] - 'a'; s[i].id = i;s[i].x = s[i - 1].x ^ (1 << o);} s[n + 1].x = 0; s[n + 1].id = 0;sort(s + 1, s + n + 2, cmp1);int tp = 0;for(int i = 1; i <= n + 1; i++) {if(s[i].x != s[i - 1].x || i == 1) tp++;S[s[i].id] = tp; oo[tp] = s[i].x;}for(int i = 0; i <= n; i++) {int hh = oo[S[i]];for(int j = 0; j < 26; j++) {int yy = hh ^ (1 << j);int l = 1, r = n + 1, ans;while(l <= r) {int mid = (l + r) / 2;if(s[mid].x <= yy) l = mid + 1, ans = mid;else r = mid - 1;} if(s[ans].x == yy) hg[i][++hg[i][0]] = S[s[ans].id];}}for(int i = 1; i <= m; i++) {q[i].l = read(), q[i].r = read(), q[i].id = i;q[i].bl = (q[i].l - 1) / p + 1;} sort(q + 1, q + m + 1, cmp);int ll = 1, rr = 0; sum = 0;for(int i = 1; i <= m; i++) {for(int j = rr + 1; j <= q[i].r; j++) jiar(j);for(int j = rr; j > q[i].r; j--) jianr(j);for(int j = ll; j < q[i].l; j++) jianl(j);for(int j = ll - 1; j >= q[i].l; j--) jial(j);ll = q[i].l, rr = q[i].r;ans[q[i].id] = sum;} for(int i = 1; i <= m; i++) printf("%d\n", ans[i]);return 0;
}
[YNOI2017]由乃的商场之旅 莫队相关推荐
- BZOJ4866 Ynoi2017由乃的商场之旅(莫队)
显然能重排为回文串相当于出现次数为奇数的字母不超过一个.考虑莫队,问题在于如何统计添加/删除一位的贡献.将各字母出现次数奇偶性看做二进制数,做一个前缀和一个后缀和.在右端添加一位时,更新区间的前缀.后 ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法
加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...
- BZOJ - 4810 [Ynoi2017]由乃的玉米田 莫队算法 + bitset 大暴力
大家都很强, 可与之共勉 . 4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MB Description 由乃在自己的农田边散 ...
- NBUT 1457 Sona(莫队算法+离散化)
[1457] Sona 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Sona, Maven of the Strings. Of cause, she can play the ...
- XOR and Favorite Number CF340E 莫队算法
题目链接 题意:求给定询问区间[L,R]问有多少连续区间异或值等k,多次询问可以离线. a[i]^a[i+1]^a[i+2]^a[n]=(a[1]^a[2]^a[3]^...^a[i-1])^(a[1 ...
- Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组
题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...
- 【莫队算法】bzoj3781 小B的询问
莫队经典. 开个数组维护a[i]出现的次数. 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> ...
- bzoj 3339 莫队
题意: 求任意一个区间的SG函数. 想到线段树,但是线段树合并很麻烦. 线段树--分块. 分块的一个应用就是莫队算法. 怎么暴力递推呢? 从一个区间到另一个区间,Ans 取决于 Ans 和 加入和删除 ...
最新文章
- 代码格式化工具 uncrustify 配置文件选项详解
- MySQL · 引擎特性 · InnoDB 崩溃恢复过程
- 【Java】7.5 正则表达式 7.6 Java 8 新增的日期、时间格式器
- spring4.0之二:@Configuration的使用
- 英特尔nuc能代替主机吗_终于圆满了!最新款的Intel NUC迷你主机上线
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
- ARP协议在同网段及跨网段下的工作原理
- html加粗字体打印失效_论文格式要求及字体大小
- 2021新茶饮研究报告
- hide your website's wordpress info/path/way
- 一文彻底搞懂App的Monkey稳定性测试
- 静态成员函数运用在CALLBACK函数和线程函数中《转载》
- ffmpeg4.3.2版本:gstavdemux.c:486:24: error: AVStream has no member named ‘index_entries‘(二十七)
- idc机房建设费用_2018年全球数据中心建设成本解读
- VAR(向量自回归)模型的stata操作——关于期货现货价格联动关系的案例
- 花老湿学习OpenCV:Shi-Tomasi角点检测
- deepin深度系统下安装QQ音乐
- 在一夜暴富之前,我先一夜秃了头
- 2.1HTML网页之table标签B
- 将一个字符串转换为对应的整数