poj 3261 Milk Patterns

本文介绍了一种结合二分查找与后缀数组技术来解决问题的方法。通过构造后缀数组并利用高度数组进行判断,可以高效地解决特定类型的问题。代码示例展示了如何实现这些算法,并提供了一个具体的解决方案。

二分答案,利用height数组进行判定。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=20000+10;
 6 const int maxvalue=1000000+10;
 7 int s[maxn];
 8 int sa[maxn],t[maxn],t2[maxn],c[maxvalue],n;
 9 int rank[maxn],height[maxn];
10 void build_sa(int m)
11 {
12     int i,*x=t,*y=t2;
13     for(i=0;i<m;i++) c[i]=0;
14     for(i=0;i<n;i++) c[x[i]=s[i]]++;
15     for(i=1;i<m;i++) c[i]+=c[i-1];
16     for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
17 
18     for(int k=1;k<=n;k<<=1)
19     {
20         int p=0;
21         for(i=n-k;i<n;i++) y[p++]=i;
22         for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
23 
24         for(i=0;i<m;i++) c[i]=0;
25         for(i=0;i<n;i++) c[x[y[i]]]++;
26         for(i=0;i<m;i++) c[i]+=c[i-1];
27         for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];
28 
29         swap(x,y);
30         p=1;x[sa[0]]=0;
31         for(i=1;i<n;i++)
32             x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
33         if(p>=n) break;
34         m=p;
35     }
36 }
37 void getHeight()
38 {
39       int i,k=0;
40       for(i=0;i<n;i++) rank[sa[i]]=i;
41       for(i=0;i<n;i++)
42       {
43           if(k) k--;
44           int j=sa[rank[i]-1];
45           while(s[i+k]==s[j+k]) k++;
46           height[rank[i]]=k;
47       }
48 }
49 bool check(int k,int num)
50 {
51     int cnt=0;
52     for(int i=0;i<n;i++)
53     {
54         if(height[i]<k)
55             cnt=0;
56         else
57         {
58             cnt++;
59             if(cnt>=num-1) return true;
60         }
61     }
62     return false;
63 }
64 int main()
65 {
66     int k;
67     while(scanf("%d%d",&n,&k)!=EOF)
68     {
69         int maxv=0;
70         for(int i=0;i<n;i++)
71         {
72             scanf("%d",&s[i]);
73             if(s[i]>maxv) maxv=s[i];
74         }
75         build_sa(maxv+1);
76         getHeight();
77         int l=1,r=n/2;
78         int ans=-1;
79         while(l<=r)
80         {
81             int mid=(l+r)>>1;
82             if(check(mid,k))
83             {
84                 ans=mid;
85                 l=mid+1;
86             }
87             else
88                 r=mid-1;
89         }
90         printf("%d\n",ans);
91     }
92     return 0;
93 }

转载于:https://www.cnblogs.com/sooflow/p/3382243.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值