Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 对TXT 的串并行读写
- 下一篇: DNS 网关 路由 交换机 网桥 协议