题目大意与上题完全一样,只是数据规模更大。
思路:
再用上题的暴力肯定TLE,所以需要优化一下搜索过程。上一题我们是外层遍历n,内层遍历3种情况。这题我们外层遍历3种情况,内层遍历数组,记录每个点的情况,后面的点可以利用前面的结果不用每次重新从零开始计数。同样实时更新最小结果。
代码:
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 }
反思:
VJ的C++编译器用的是Microsoft Visual C++ 2010,使用string要加上<string>
---恢复内容结束---