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]由乃的商场之旅 莫队相关推荐

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

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

  2. BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...

  3. BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法

    加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...

  4. BZOJ - 4810 [Ynoi2017]由乃的玉米田 莫队算法 + bitset 大暴力

    大家都很强, 可与之共勉 . 4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MB Description 由乃在自己的农田边散 ...

  5. NBUT 1457 Sona(莫队算法+离散化)

    [1457] Sona 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Sona, Maven of the Strings. Of cause, she can play the ...

  6. 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 ...

  7. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  8. 【莫队算法】bzoj3781 小B的询问

    莫队经典. 开个数组维护a[i]出现的次数. 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> ...

  9. bzoj 3339 莫队

    题意: 求任意一个区间的SG函数. 想到线段树,但是线段树合并很麻烦. 线段树--分块. 分块的一个应用就是莫队算法. 怎么暴力递推呢? 从一个区间到另一个区间,Ans 取决于 Ans 和 加入和删除 ...

最新文章

  1. 代码格式化工具 uncrustify 配置文件选项详解
  2. MySQL · 引擎特性 · InnoDB 崩溃恢复过程
  3. 【Java】7.5 正则表达式 7.6 Java 8 新增的日期、时间格式器
  4. spring4.0之二:@Configuration的使用
  5. 英特尔nuc能代替主机吗_终于圆满了!最新款的Intel NUC迷你主机上线
  6. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
  7. ARP协议在同网段及跨网段下的工作原理
  8. html加粗字体打印失效_论文格式要求及字体大小
  9. 2021新茶饮研究报告
  10. hide your website's wordpress info/path/way
  11. 一文彻底搞懂App的Monkey稳定性测试
  12. 静态成员函数运用在CALLBACK函数和线程函数中《转载》
  13. ffmpeg4.3.2版本:gstavdemux.c:486:24: error: AVStream has no member named ‘index_entries‘(二十七)
  14. idc机房建设费用_2018年全球数据中心建设成本解读
  15. VAR(向量自回归)模型的stata操作——关于期货现货价格联动关系的案例
  16. 花老湿学习OpenCV:Shi-Tomasi角点检测
  17. deepin深度系统下安装QQ音乐
  18. 在一夜暴富之前,我先一夜秃了头
  19. 2.1HTML网页之table标签B
  20. 将一个字符串转换为对应的整数

热门文章

  1. 【备忘】linux视频
  2. 如何下载网页上的视频
  3. 旷视2020图像算法工程师机考题(15道选择题)
  4. Jmeter性能测试云平台搭建
  5. vue 跳转到指定路由地址 (可附带参数)
  6. gRPC-拦截器简单使用
  7. Vue 扫码及生成二维码
  8. CentOS 7.2 配置Apache服务(httpd)--上篇
  9. 计算机科学数学姚期智,科学网—姚期智:一流,从“姚班”开始 - 孙滔的博文...
  10. 计算机第二课堂教学计划,小学第二课堂教学计划