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 ...
随机推荐
- 快速导入导出Oracle数据demo(sqlldr、UTL_FILE)
本文演示快速sqlldr导入.UTL_FILE导出Oracle表数据实例 表结构如下,演示数据约112万,可自行准备. create table MemberPointDemo ( MEMBERID ...
- 几何学观止(Lie群部分)
上承这个页面,这次把Lie群的部分写完了 几何学观止-微分几何部分(20181102).pdf 我觉得其他部分(尤其是代数几何部分)我目前没有把握写得令自己满意,总之希望在毕业前能写完吧. 这次调整了 ...
- Contest1692 - 2019寒假集训第三十一场 UPC 11075 Problem D 小P的国际象棋
非常简单的单点修改+区间加+区间查询.我用的是最近刚学的区间修改版本树状数组. 直接维护即可,注意修改后的单点值已经不是a[i],或者b[i],要通过区间查询求单点.不然是错的. 区间修改版本树状数 ...
- 使用Request+正则抓取猫眼电影(常见问题)
目前使用Request+正则表达式,爬取猫眼电影top100的例子很多,就不再具体阐述过程! 完整代码github:https://github.com/connordb/Top-100 总结一下,容 ...
- 各种jar包
springframework下载地址:http://maven.springframework.org/release/org/springframework/spring/ commons开头的j ...
- scrapy之管道
scrapy之管道 通过管道将数据持久化到数据库中,企业中常见的数据库是MySQL,分布式爬取数据时只能讲数据存储到Redis装,还可以将数据存储到本地磁盘(即写入到本地文件中). 未完待续... 0
- 软件工程(FZU2015) 赛季得分榜,第六回合
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...
- Linux 典型应用之WebServer 安装和配置
Apache的基本操作 安装 yum install httpd 启动 service httpd start 在浏览器中输入以下Ip 发现无法访问 http://192.168.1.109/ 输入 ...
- Postman的Post请求方式的四种类型的数据
1. form-data 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件时 ...
- [转帖]2015年时微软Win3.1崩溃迫使巴黎奥利机场短暂关闭
https://www.ithome.com/html/it/188796.htm IT之家讯 2015年11月14日消息,上周法国巴黎奥利机场因为微软的Windows 3.1系统出现故障不得不迫使所 ...