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 }