Problem A
Accepts: 1829
Submissions: 12436
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
以每个位置字母的哈希值为叶子节点向上建立线段树,然后区间查询即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
const int maxn = 100000, mod = 9973;
int sum[maxn << 2], cnt, len;
char s[maxn + 10];
void PushUp(int rt) {
sum[rt] = ((sum[rt << 1] % mod) * (sum[rt << 1 | 1] % mod)) % mod;
}
void build(int l, int r, int rt) {
if (l == r) {
sum[rt] = ((int)s[++cnt] - 28) % mod;
return;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUp(rt);
}
int query(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) {
return sum[rt];
}
int m = (l + r) >> 1;
int res = 1;
if (L <= m) {
res *= (query(L, R, lson) % mod);
}
if (R > m) {
res *= (query(L, R, rson) % mod);
}
return res % mod;
}
int main()
{
int N;
while (~scanf("%d", &N)) {
scanf("%s", s + 1);
cnt = 0;
len = strlen(s + 1);
build(1, len, 1);
for (int t = 1; t <= N; t++) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", query(x, y, 1, len, 1));
}
}
return 0;
}