原題連接ios
題目大意與上題徹底同樣,只是數據規模更大。數組
思路:優化
再用上題的暴力確定TLE,因此須要優化一下搜索過程。上一題咱們是外層遍歷n,內層遍歷3種狀況。這題咱們外層遍歷3種狀況,內層遍歷數組,記錄每一個點的狀況,後面的點能夠利用前面的結果不用每次從新從零開始計數。一樣實時更新最小結果。spa
代碼:code
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #define MAX 200005 5 6 using namespace std; 7 8 long long q, n, k; 9 string sset = "RGB"; 10 11 int main() 12 { 13 cin >> q; 14 15 while (q--) 16 { 17 string s; 18 cin >> n >> k >> s; 19 int ans = MAX; 20 21 for (int i = 0; i < 3; i++) 22 { 23 vector<int> res(n); 24 int cur = 0; 25 for (int j = 0; j < n; j++) 26 { 27 res[j] = (s[j] != sset[(j+i)%3]); 28 cur += res[j]; 29 if (j >= k) 30 { 31 cur -= res[j-k]; 32 } 33 if (j >= k - 1) 34 { 35 ans = min(ans, cur); 36 } 37 } 38 } 39 cout << ans << endl; 40 } 41 }
反思:blog
VJ的C++編譯器用的是Microsoft Visual C++ 2010,使用string要加上<string>ci
---恢復內容結束---get