Created
September 15, 2018 09:03
-
-
Save completejavascript/ccb38cb8e4b535e3e90c99f8034f2a19 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
char str[1000005]; // Lưu xâu đầu vào | |
int cnt[1000]; // Mảng đếm tần suất xuất hiện của kí tự | |
int main() | |
{ | |
freopen("input.txt","r",stdin); | |
ios::sync_with_stdio(false); | |
int m = -1, length = 0; | |
char gar; | |
while(true) | |
{ | |
// Nhập đầu vào và tính độ dài của xâu | |
cin >> m; | |
if (m == 0) break; | |
gar = cin.get(); | |
length = 0; | |
cin.getline(str, 1000005); | |
while(str[length] != '\0') length++; | |
for(int i=0; i<1000;i++) | |
cnt[i] = 0; | |
////////////////////////// | |
int _max = 0; // Độ dài xâu con lớn nhất thỏa mãn | |
int start = 0; // chỉ số bắt đầu | |
int id = 0; // chỉ số hiện tại | |
int numDiffChar = 0; // số kí tự khác nhau từ chỉ số bắt đầu đến chỉ số hiện tại | |
// Duyệt từ đầu đến cuối xâu | |
while(id < length) | |
{ | |
// Giá trị mảng đếm = 0 nghĩa là kí tự đó chưa tồn tại | |
if(cnt[str[id]] == 0) | |
{ | |
// Nếu số kí tự khác nhau nhỏ hơn m thì ta sẽ cho kí tự đó vào xâu con | |
// đồng thời tăng giá trị biến đếm số lần xuất hiện của kí tự, số kí tự khác nhau | |
// và chỉ số hiện tại | |
if(numDiffChar < m) | |
{ | |
cnt[str[id]] = 1; | |
numDiffChar++; | |
id++; | |
} | |
else if(numDiffChar == m) | |
{ | |
// Nếu số kí tự khác nhau đã bằng m rồi | |
// thì ta không thể thêm kí tự mới vào, khi đó số kí tự khác nhau sẽ là m + 1 | |
// Do đó tôi phải dịch chỉ số bắt đầu lên cho đến khi số kí tự khác nhau < m | |
// Lúc đó mới có thể thêm kí tự mới. | |
int t = id - start; | |
if(t > _max) _max = t; | |
while(numDiffChar == m) | |
{ | |
cnt[str[start]]--; | |
if(cnt[str[start]] == 0) numDiffChar--; | |
start++; | |
} | |
} | |
} | |
else | |
{ | |
// Trường hợp kí tự đó đã xuất hiện trong xâu con rồi | |
// thì tôi chỉ cần biến đếm số lần xuất hiện của kí tự đó. | |
cnt[str[id]]++; | |
id++; | |
} | |
} | |
int t = id - start; | |
if(t > _max) _max = t; | |
cout << _max << endl; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment