1 条题解
-
0
自动搬运
来自洛谷,原作者为

honglan0301
AFO —— 只是我的心一直在问,用什么把你永久留下~ | 2024.07.25 — ?搬运于
2025-08-24 22:46:23,当前版本为作者最后更新于2023-04-15 08:31:42,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目分析
感觉没有很好的性质,但是观察 的数据范围发现限制给的很松,一方面是 与 的差距很小,另一方面是 的容错率比较大,所以考虑简单的随机算法。
我们直接枚举 的长度 , 对于每个长度随一些位置 , 检测在随的这些 中有多少个满足 , 记作 , 然后取 所对应的 作为 即可,看数据范围容易发现正确率极高(因为时间限制足够随很多次,于是 与整体情况的偏差超过 的概率极低)。
那么随 次,令 的每一位 取 中出现次数最多的字符即可通过本题。
代码
/* author: PEKKA_l */ #include <iostream> #include <cstring> #include <algorithm> #include <random> using namespace std; int l,n,m,lmx,cnt[35]; char s[300005],ans[300005]; mt19937 mt_rand(time(0)); int getrd(int l,int r) {return l+mt_rand()%(r-l+1);} int check(int len)//随机 { int cntt=0; for(int i=1;i<=600;i++) {int wz=getrd(0,l-len-1); if(s[wz]==s[wz+len]) cntt++;} return cntt; } signed main() { cin>>l>>lmx>>n>>m>>s; int mxx=0,nmm;//枚举 l_0 for(int i=lmx;i>=1;i--) {int nans=check(i); if(nans>mxx) {mxx=nans; nmm=i;}} for(int j=0;j<nmm;j++) { memset(cnt,0,sizeof(cnt)); int nnum=-1,nmax=0; for(int k=j;k<l;k+=nmm) { cnt[s[k]-'a'+1]++; if(cnt[s[k]-'a'+1]>nmax) {nmax=cnt[s[k]-'a'+1]; nnum=s[k]-'a'+1;} } ans[j]=(char)(nnum+'a'-1); } cout<<nmm<<endl<<ans<<endl; }
- 1
信息
- ID
- 8113
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者