这题思路很顺,十来分钟就写完了一版,但是用了map然后tle了,看了大佬的题解学到了不用map的计数方式
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
#include<vector>
#define moomoon ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define ull unsigned long long
#define ll long long
#define int long
using namespace std;
const int MAXN=2e5+10;
int n,k;
int arr[MAXN];
ull hash[MAXN];
ull p[MAXN];
ull cnt[MAXN];
bool check(int mid){
int num=0;
for(int i=0;i+mid<=n;i++){
ull now=hash[i+mid]-hash[i]*p[mid];
cnt[++num]=now;
}
sort(cnt+1,cnt+1+num);
int ans=1;ull pre=cnt[1];
for(int i=2;i<=num;i++){
if(cnt[i]==pre){
ans++;
if(ans>=k)return true;
}
else {
pre=cnt[i];
ans=1;
}
}
return false;
}
signed main(){
moomoon;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
p[0]=1;
for(int i=1;i<=n;i++){
hash[i]=hash[i-1]*131+arr[i];
p[i]=p[i-1]*131;
}
int l=0,r=n;
while(l<r){
int mid=(l+r+1)/2;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<l<<endl;
}