Milk Patterns POJ - 3261(哈希)

Milk Patterns

 POJ - 3261

题意:问长度为n的串中至少出现k次的子串最长是多长。

二分长度,再判断是否有子串重复k次。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 #define ull unsigned long long
 7 const int maxn=20010;
 8 const int seed=131;
 9 
10 ull base[maxn],h[maxn];
11 int a[maxn];
12 int n,k;
13 
14 int check(int m)
15 {
16     memset(h,0,sizeof(h));
17     for(int i=0;i<m;i++) h[m-1]=h[m-1]*seed+a[i];
18     for(int i=m;i<n;i++){
19         h[i]=h[i-1]*seed-a[i-m]*base[m]+a[i];
20     }
21     sort(h,h+n);
22     int cnt=1;
23     for(int i=n-1;i>=m;i--){
24         if(h[i]==h[i-1]) cnt++;
25         else cnt=1;
26         if(cnt>=k) return 1;
27     }
28     return 0;
29 }
30 int main()
31 {
32     base[0]=1;
33     for(int i=1;i<maxn;i++) base[i]=base[i-1]*seed;
34     while(scanf("%d%d",&n,&k)!=EOF){
35         for(int i=0;i<n;i++){
36             scanf("%d",&a[i]);
37         }
38         int L=0,R=n;
39         while(L<=R){
40             int m=L+(R-L)/2;
41             if(check(m)) L=m+1;
42             else R=m-1;
43         }
44         printf("%d\n",R);
45     }
46 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7388216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值