As Easy As Possible
2016-10-06 09:58
447 查看
题意:给定一个字符串,有多段查询,问 (l,r) 中最多出现了多少个 easy
倍增
先预处理,对于每一个e往后跳 2**0 步是最接近它的a,每个a往后跳 2**0步是最接近它的s,以此类推。y后面要接e,于是就用倍增,利用f[i][j]表示第i位往后跳2**j步所到达的位置。然后对于每次查询,先找到第一个大于等于l的 e,然后看最多能往后面跳多少步,结果除以4就是答案。
#include <stdio.h> #include <stdlib.h> #include <string.h> const int maxn = 200000; char s[maxn]; int se[maxn], sa[maxn], ss[maxn], sy[maxn]; int f[maxn][100], x, y, l, r, mid, t, step, n, len; int main() { scanf("%s", s); len = strlen(s); for (int i = len; i >= 1; i--) s[i] = s[i-1]; for (int i = 1; i <= len; i++) { if (s[i] == 'e') { se[++se[0]] = i; for (int j = sy[0]; j >= 1; j--) { if (f[sy[j]][0] != 0) break; f[sy[j]][0] = i; } } else if (s[i] == 'a') { sa[++sa[0]] = i; for (int j = se[0]; j >= 1; j--) { if (f[se[j]][0] != 0) break; f[se[j]][0] = i; } } else if (s[i] == 's') { ss[++ss[0]] = i; for (int j = sa[0]; j >= 1; j--) { if (f[sa[j]][0] != 0) break; f[sa[j]][0] = i; } } else if (s[i] == 'y') { sy[++sy[0]] = i; for (int j = ss[0]; j >= 1; j--) { if (f[ss[j]][0] != 0) break; f[ss[j]][0] = i; } } } for (int i = 1; i <= len; i++) if (f[i][0] == 0) f[i][0] = maxn; for (int j = 0; 1<<j <= len; j++) for (int i = 1; i <= len; i++) { if (f[i][j] == maxn) f[i][j+1] = maxn; else f[i][j+1] = f[f[i][j]][j]; } scanf("%d", &n); while (n--) { scanf("%d%d", &x, &y); l = 1; r = se[0]; t = 0; while (l <= r) { mid = (l+r)/2; if (se[mid] >= x) { t = se[mid]; r = mid-1; } else l = mid+1; } if (t == 0 || t > y) { printf("0\n"); continue; } step = 0; while (t <= y) { if (f[t][0] > y) break; for (int j = 1; j <= len+1; j++) if (f[t][j] > y) { step += 1<<(j-1); t = f[t][j-1]; break; } } printf("%d\n", (step+1)/4); } }
相关文章推荐
- BNUOJ 52317 As Easy As Possible 树上倍增/主席树
- As Easy As Possible
- 【分块】MIPT-2016 Pre-Finals Workshop, Taiwan NTU Contest, Sunday, March 27, 2016 Problem A. As Easy As Possible
- BNUOJ52317 As Easy As Possible(树上倍增)
- bnuoj 52317 As Easy As Possible(预处理+倍增法)
- 2016弱校联盟十一专场10.5---As Easy As Possible(倍增)
- BNUOJ 52317 As Easy As possible
- As Easy As Possible 倍增法
- 弱校连萌 2016 国庆训练计划 10,5 Problem A. As Easy As Possible
- 2016弱校联盟十一专场10.5---As Easy As Possible(倍增)
- HDU-1040-As Easy As A+B(诚如题目所说和A+B一样简单-插入排序水过)
- Kernel: Do NOT use global variable as possible as you can 尽量不使用全局变量
- as-conformal-as-possible discrete volumetric mapping
- As Easy As A+B
- HDU 1040 As Easy As A+B(水~)
- hdoj 1040 As Easy As A+B 【归并排序】
- hdu1040 As Easy As A+B(堆排序)
- As Easy As A+B hdu 1040
- 学语言最好的方法是尽量多地联系使用它。(The way to learn a language is to practice using it as often as possible.)
- 【杭电oj】1040 - As Easy As A+B (快排,巨水)