Solution - P2852 [USACO06DEC] Milk Patterns G
思路
哈希水题。二分答案,然后爆搜就能过。好水
代码
#include <bits/stdc++.h>
#define rint register int
#define rllong register long long
#define llong long long
#define N 20005
using namespace std;
constexpr llong k1 = 1145141, mod1 = 119<<23|1;
constexpr llong k2 = 9936257, mod2 = 1e9+7;
typedef pair<llong, llong> Key;
map<Key, int> cnt;
llong fac1[N], fac2[N];
llong hsh1[N], hsh2[N];
int a[N];
int n, k;
inline bool check(rint len){
cnt.clear();
for(rint i = 1; i <= n-len+1; ++i){
Key key = make_pair((hsh1[i+len-1]-hsh1[i-1]+mod1)*fac1[n-i]%mod1, (hsh2[i+len-1]-hsh2[i-1]+mod2)*fac2[n-i]%mod2);
++cnt[key];
if(cnt[key] >= k) return true;
}
return false;
}
int main(){
scanf("%d %d", &n, &k);
for(rint i = 1; i <= n; ++i) scanf("%d", &a[i]);
fac1[0] = fac2[0] = 1;
for(rint i = 1; i <= n; ++i){
fac1[i] = fac1[i-1]*k1%mod1, fac2[i] = fac2[i-1]*k2%mod2;
hsh1[i] = (hsh1[i-1]+a[i]*fac1[i]%mod1)%mod1;
hsh2[i] = (hsh2[i-1]+a[i]*fac2[i]%mod2)%mod2;
}
rint l = 1, r = n-k+1;
while(l < r){
rint mid = l+r+1>>1;
if(check(mid)) l = mid;
else r = mid-1;
}
printf("%d", l);
return 0;
}