Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组

链接:

http://codeforces.com/contest/828/problem/E

题解:

给你一个字符串s  q次操作 op==1 改变s[pos]位置的字符  op==2 将字符串e复制无限次 求从l开始s[l] == e[0]  ,s[l+1] == e[1] ...... s[r] == e[r-l]成立的有多少个

题解:

开一个C[10][10][4][n],第二维表示e的长度,第一维表示i%e的长度,第三维表示颜色,第四维求和了

代码:

31 int T[12][12][4][MAXN];
32 int n;
33 
34 void add(int a, int b, int c, int d, int x) {
35     while (d <= n) T[a][b][c][d] += x, d += d&-d;
36 }
37 
38 int sum(int a, int b, int c, int d) {
39     int res = 0;
40     while (d) res += T[a][b][c][d], d -= d&-d;
41     return res;
42 }
43 
44 int main() {
45     ios::sync_with_stdio(false), cin.tie(0);
46     map<char, int> mmp;
47     mmp['A'] = 0;
48     mmp['T'] = 1;
49     mmp['G'] = 2;
50     mmp['C'] = 3;
51     string s;
52     cin >> s;
53     n = s.length();
54     rep(i, 0, n) rep(j, 1, 11) add(i%j, j, mmp[s[i]], i + 1, 1);
55     int q;
56     cin >> q;
57     while (q--) {
58         int k;
59         cin >> k;
60         if (k == 1) {
61             int x;
62             char c;
63             cin >> x >> c;
64             x--;
65             rep(j, 1, 11) {
66                 add(x%j, j, mmp[s[x]], x + 1, -1);
67                 add(x%j, j, mmp[c], x + 1, 1);
68             }
69             s[x] = c;
70         }
71         else {
72             int l, r;
73             string e;
74             cin >> l >> r >> e;
75             l--, r--;
76             int len = e.length();
77             int res = 0;
78             rep(i, 0, len)
79                 res += sum((l + i) % len, len, mmp[e[i]], r + 1)
80                 - sum((l + i) % len, len, mmp[e[i]], l);
81             cout << res << endl;
82         }
83     }
84     return 0;
85 }
原文地址:https://www.cnblogs.com/baocong/p/7209344.html