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 ...
随机推荐
- 如何让.net程序支持TLS1.2
1.将.Net FrameWork设置成4.6以上版本 2.在需要的类中引入命名空间 using System.Net; 3.在程序调用接口(如支付)的地方,加一段代码即可 System.Net.Se ...
- Python里面如何拷贝一个对象
1.赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个. In [168]: a Out[168]: [1, 2, 3] In [169]: b=a In [170]: a ...
- 使用publisher模式控制频繁的UI输出,避免Winform界面假死
http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺
Deadline: 2018-4-29 10:00PM,以提交至班级博客时间为准. 根据以下要求,团队在日期区间[4.16,4.29]内,任选8天进行冲刺,冲刺当天晚10点前发布一篇随笔,共八篇. 另 ...
- phantomjs 了解
转自:http://www.cnblogs.com/lei0213/ PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎.它原生支持多种web 标准:DOM 操作,CSS选择器,JS ...
- react组件选项卡demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java 获取当前日期的四种方法
//1 通过Date类来获取当前时间,通过SimpleDateFormat来设置时间格式 SimpleDateFormat dateFormat = new SimpleDateFormat(&quo ...
- [转帖]TCP和UDP的135、137、138、139、445端口的作用
TCP和UDP的135.137.138.139.445端口的作用 https://www.cnblogs.com/IvanChen/p/4500698.html 竟然不知道 端口具体是干什么的.. 如 ...
- 模态框 modal data-toggle data-target
模态框 modal data-toggle data-target 1. Data-*属性 模态框(modal) 触发事件(data-toggle) 触发对象data-target(ID 或类) ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...