![]()
![]()
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10, M = 2010;
int n, m;
int a[N];
int st[M];
int ll, rr = 1e8;
int main() {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
int l = 0, r = -1, cnt = 0;
for(; r ++ < n;) {
if(st[a[r]] == 0) cnt ++ ;
st[a[r]] ++ ;
while(st[a[l]] > 1) {
st[a[l]] -- ;
l ++ ;
}
if(cnt >= m) {
if(r - l < rr - ll) {
rr = r, ll = l;
}
}
}
cout << ll + 1 << ' ' << rr + 1 << endl;
return 0;
}
![]()
class Solution {
public:
int expressiveWords(string s, vector<string>& words) {
int n = s.size();
int res = 0;
auto check = [&](string &s, string &p) -> bool {
int n1 = s.size(), n2 = p.size();
int p1 = 0, p2 = 0;
while(p1 < n1 && p2 < n2) {
int cnt1 = 0, cnt2 = 0;
char c = s[p1];
while(p1 < n1 && s[p1] == c) p1 ++ , cnt1 ++ ;
while(p2 < n2 && p[p2] == c) p2 ++ , cnt2 ++ ;
if(cnt1 < cnt2 || (cnt1 > cnt2 && cnt1 < 3)) return 0;
}
return p1 == n1 && p2 == n2;
};
for(auto &word: words) {
if(check(s, word)) res ++ ;
}
return res;
}
};
![]()
class Solution {
public:
int longestStrChain(vector<string>& words) {
int n = words.size();
sort(words.begin(), words.end(), [&](auto &a, auto &b) {
return a.size() < b.size();
});
vector<int> f(n, 1);
auto check = [&](string &a, string &b) -> bool {
int n = a.size(), m = b.size();
if(n >= m || m - n >= 2) return false;
int i = 0, j = 0, cnt = 0;
while(i < n && j < m) {
if(a[i] == b[j]) i ++ ;
else{
cnt ++ ;
}
j ++ ;
}
return cnt < 2;
};
for(int i = 0; i < n; i ++ ) {
for(int j = 0; j < i; j ++ ) {
if(check(words[j], words[i])) {
f[i] = max(f[i], f[j] + 1);
}
}
}
return *max_element(f.begin(), f.end());
}
};