Skip to content

Instantly share code, notes, and snippets.

@completejavascript
Created September 15, 2018 09:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save completejavascript/ccb38cb8e4b535e3e90c99f8034f2a19 to your computer and use it in GitHub Desktop.
Save completejavascript/ccb38cb8e4b535e3e90c99f8034f2a19 to your computer and use it in GitHub Desktop.
#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