Codeforces1065G Fibonacci Suffix 【递推】【二分答案】
题目分析:
首先为了简便起见我们把前$15$的答案找出来,免得我们还要特判$200$以内之类的麻烦事。
然后我们从$16$开始递推。考虑猜测第i位是$0$还是$1$(这本质上是个二分)。一开始先猜是$1$,然后求是$0$的有多少个,与当前的$k$判断确认$0$和$1$。
然后考虑到某种情况就不输出的情况,实际上就是末尾的这个$ans$正好合法。
然后递推的时候除了将两个串原本出现的加起来,还要考虑拼接的时候多出的。可以预处理也可以边$dp$边做。
不预处理的暴力做时间是$O(mn^3)$(过不了)
预处理的暴力做是$O(mn^2)$
不预处理的KMP是$O(mn^2)$
预处理的KMP是$O(mn)$。
自行选择。
代码:
#include<bits/stdc++.h>
using namespace std; int n,m;long long k; string str[],suf[]; long long f[],d[],h[],qy[][];
string p[],s[];
string ans; int cmp(string alpha,string beta){
for(int i=;i<min(alpha.length(),beta.length());i++){
if(alpha[i] == beta[i]) continue;
if(alpha[i] < beta[i]) return ;
else return ;
}
return alpha.length()<beta.length();
} int Try(string a){
int res = ;
for(int i=;i<a.length();i++){
if(i+ans.length()- >= a.length()) break;
int flag = true;
for(int j=;j<ans.length();j++){
if(a[i+j] != ans[j])flag = false;
}
res += flag;
}
return res;
} long long solve(){//200
//match 200*200
int len = ans.length();
memset(d,,sizeof(d));
memset(h,,sizeof(h));
memset(qy,,sizeof(qy));
p[].clear();p[].clear();s[].clear();s[].clear();
d[] = h[] = ; d[] = h[] = ;
for(int i=;i<len-;i++) p[].push_back(str[][i]),p[].push_back(str[][i]);
for(int i=;i<=len-;i++) s[].push_back(str[][str[].length()-len+i]);
for(int i=;i<=len-;i++) s[].push_back(str[][str[].length()-len+i]);
for(int i=;i<;i++) for(int j=;j<;j++) qy[i][j] = Try(p[i]+s[j]); f[] = Try(str[]); f[] = Try(str[]); for(int i=;i<=n;i++){//
h[i] = h[i-]; //suf
d[i] = d[i-]; //pre
f[i] = f[i-]+f[i-];
f[i] += qy[d[i]][h[i]];
if(f[i] > 1e18) return f[i];//return now
}
return f[n];
} int main(){
scanf("%d%lld%d",&n,&k,&m);
str[] = ""; str[] = "";
for(int i=;i<=;i++) str[i] = str[i-]+str[i-];
if(n <= ){
for(int i=;i<str[n].length();i++){
for(int j=i;j<str[n].length();j++) suf[i+].push_back(str[n][j]);
}
sort(suf+,suf+str[n].length()+,cmp);
for(int i=;i<min(m,(int)suf[k].length());i++) printf("%c",suf[k][i]);
return ;
}else{
for(int i=;i<=m;i++){
ans.push_back('');
long long z = solve();
if(z < k){ k -= z; ans.pop_back(); ans.push_back(''); }
int flag = ;
for(int i=suf[n].length()-ans.length(),j=;i<suf[n].length();i++){
if(ans[j] != suf[n][i]) flag = false;
j++;
}
k -= flag;
if(k == ){
for(int i=;i<ans.length();i++) printf("%c",ans[i]);
return ;
}
}
for(int i=;i<ans.length();i++) printf("%c",ans[i]);
} return ;
}
Codeforces1065G Fibonacci Suffix 【递推】【二分答案】的更多相关文章
- HDU 1250 Hat's Fibonacci (递推、大数加法、string)
Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 【Atcoder】AGC 020 B - Ice Rink Game 递推
[题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...
- 斐波那契数列 递归 尾递归 递推 C++实现
==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...
- UVA - 11021 - Tribles 递推概率
GRAVITATION, n.“The tendency of all bodies to approach one another with a strengthproportion to the ...
- 12563 - Jin Ge Jin Qu hao——[DP递推]
(If you smiled when you see the title, this problem is for you ^_^) For those who don’t know KTV, se ...
- 从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺
人类发明了轮子,提高了力的使用效率. 人类发明了自动化机械,将自己从重复的工作中解脱出来. 提高效率的方法好像总是离不开两点:拒绝无效劳动,拒绝重复劳动.人类如此,计算机亦如是. 前面我们说过了四数之 ...
- 【Luogu】【关卡2-12】递推与递归二分(2017年10月)
任务说明:递推,层层递进,由基础推向顶层.二分不仅可以用来查找数据,还可以确定最合适的值. P1192 台阶问题 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶 ...
- Bzoj 1046: [HAOI2007]上升序列 二分,递推
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3671 Solved: 1255[Submit][Stat ...
- SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)
Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...
随机推荐
- WPF仿网易云音乐系列(二、歌单创建窗口+登录设置模块)
老衲牺牲午休时间写博客,都快把自己感动了,-_-!! 之前上一篇随笔,我看了下评论,有部分人说WPF已经凉凉了,这个我觉得,这只是一个达到自己目的的工具而已,只要自己能用这个工具,得心应手的做出自己想 ...
- HTTP请求中的Keep-Alive模式,是怎么区分多个请求的?
Keep-Alive模式 我们都知道HTTP是基于TCP的,每一个HTTP请求都需要进行三步握手.如果一个页面对某一个域名有多个请求,就会进行频繁的建立连接和断开连接.所以HTTP 1.0中出现了Co ...
- Could not open connection
意思是不能打开JDBC连接,如果代码没写错的话就是服务没打开,开一下服务就行了,oracle两个必开的服务:OracleServiceORCL和OracleOraDb11g_home2TNSListe ...
- OSS网页上传和断点续传(STSToken篇)
云账号AccessKey拥有所有API访问权限,在客户端不要直接使用,会泄露ak信息,造成安全问题.所以使用STS方式(临时账号权限)给客户端授权. C#版获取STSToken 一.下载阿里SDK(a ...
- message:GDI+ 中发生一般性错误。
图片类型的文件保存的时候出了问题,可能是路径出错,也可能是保存到的文件夹不存在导致(发布项目的时候如果文件夹是空的,文件夹将不存在)
- 【学习总结】Git学习-参考廖雪峰老师教程二-安装Git
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- windows下linux子系统安装
1.打开Windows功能中的使用于linux的Windows子系统 2.应用商店中下载需要的linux 3.下载完成后运行等待安装并输入用户名密码 4.查看系统信息 先后 sudo apt-get ...
- Windows字符集安装
0. 获取字符集安装文件. 最简单的办法 上msdn i tell you 下载 多语言安装盘. 一般都比较大. 比如: 1. 进入windows10 操作系统. 运行输入: lpksetup 选择安 ...
- day84
在建表写字端时,id可以不写,orm会自动创建 表模型如果不写主键,orm会自动创建一个主键 from django.db import models # Create your models her ...
- bootstrap.css.map 404
删除bootstrap.css的最后一行即可: /*# sourceMappingURL=bootstrap.css.map */ English: from bootstrap-theme.css ...