原题连接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