ok nếu như bạn chưa ac thì cách làm của bài này là mình sẽ gọi last_len là độ dài của xâu liên tiếp trước ( cả 0 và 1 đều được) cur_len là độ dài xâu liên tiếp tính tới hiện tại. với mỗi \(i\) thuộc \(0<=i<s.size\) thì kiểm tra nếu \(s[i]==s[i - 1]\)(s[i] có thuộc xâu liên tiếp hiện tại hay không), nếu có thì tăng cur_len nếu không thì ta sẽ đặt last_len = cur_len và cur_len = 1 (s[i] sẽ là phần tử đầu của xâu liên tiếp mới), cuối mỗi lần kiểm tra thì ta lấy res = max(res, min(cur_len, last_len) * 2). Dưới đây là code của mình (C++):
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, res;
int main()
{
string s;
cin >> s;
int last_len = 0, cur_len = 1;
for(int i = 1; i < s.size(); ++i){
if(s[i] == s[i - 1]) cur_len++;
else{
last_len = cur_len;
cur_len = 1;
}
res = max(res, min(cur_len, last_len) * 2);
}
cout << res;
}
Bình luận
có ai cho tui xin thuật toán bài này được không
ok nếu như bạn chưa ac thì cách làm của bài này là mình sẽ gọi last_len là độ dài của xâu liên tiếp trước ( cả 0 và 1 đều được) cur_len là độ dài xâu liên tiếp tính tới hiện tại. với mỗi \(i\) thuộc \(0<=i<s.size\) thì kiểm tra nếu \(s[i]==s[i - 1]\)(s[i] có thuộc xâu liên tiếp hiện tại hay không), nếu có thì tăng cur_len nếu không thì ta sẽ đặt last_len = cur_len và cur_len = 1 (s[i] sẽ là phần tử đầu của xâu liên tiếp mới), cuối mỗi lần kiểm tra thì ta lấy res = max(res, min(cur_len, last_len) * 2). Dưới đây là code của mình (C++):
Có rồi nhìn trông đơn giản nhưng lúc chưa có suy nghĩ vắt não ý