题目分析:

首先为了简便起见我们把前$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 【递推】【二分答案】的更多相关文章

  1. HDU 1250 Hat's Fibonacci (递推、大数加法、string)

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. 【Atcoder】AGC 020 B - Ice Rink Game 递推

    [题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...

  3. 斐波那契数列 递归 尾递归 递推 C++实现

    ==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...

  4. UVA - 11021 - Tribles 递推概率

    GRAVITATION, n.“The tendency of all bodies to approach one another with a strengthproportion to the ...

  5. 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 ...

  6. 从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺

    人类发明了轮子,提高了力的使用效率. 人类发明了自动化机械,将自己从重复的工作中解脱出来. 提高效率的方法好像总是离不开两点:拒绝无效劳动,拒绝重复劳动.人类如此,计算机亦如是. 前面我们说过了四数之 ...

  7. 【Luogu】【关卡2-12】递推与递归二分(2017年10月)

    任务说明:递推,层层递进,由基础推向顶层.二分不仅可以用来查找数据,还可以确定最合适的值. P1192 台阶问题 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶 ...

  8. Bzoj 1046: [HAOI2007]上升序列 二分,递推

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3671  Solved: 1255[Submit][Stat ...

  9. SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)

    Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...

随机推荐

  1. MySQL 数据库 初识

    ---------------------------------------------确定目标,认准目标,前进,克服困难,前进,克服困难,前进克服困难,前进. # # -------------- ...

  2. 循环 while

    day 2 ---------------------------------------------------把一件简单的事情做到极致,你就成功了. Day2作业及默写 1.判断下列逻辑语句的Tr ...

  3. struts2的基本使用

    struts2在web中当作前端控制器,接收来自页面的请求,使用过滤器拦截模式对请求进行拦截并交给相应配置的action类处理. 所以在web中使用最重要的是struts2的核心过滤器StrutsPr ...

  4. stl stack用法

    栈后进先出 #include<iostream> #include<algorithm> #include<cstdio> #include<stack> ...

  5. c++入门之内置数组和array比较

    array是C++11中新提出来的容器类型,与内置数组相比,array是一种更容易使用,更加安全的数组类型,可以用来替代内置数组.作为数组的升级版,继承了数组最基本的特性,也融入了很多容器操作,下面介 ...

  6. git更新提交代码常用命令

    git pull 拉取代码 git add -A 提交所有变化(包括删除.新增.修改) git commit -m "注释" 本地仓库提交 git push origin mast ...

  7. iframe跨域解决方案

    公司某个功能用的是iframe,由于跨域的原因,我们不能直接设置父级页面iframe的高度,所以用了一个中间页home来完成父级页面iframe的高度设置,这种中间页其实很多时候不好用,因为涉及到页面 ...

  8. Java中JDK和JRE的区别是什么?它们的作用分别是什么?

    JDK和JRE是Java开发和运行工具,其中JDK包含了JRE,但是JRE是可以独立安装的,它们在Java开发和运行的时候起到不同的作用~ 1.JDK JDK是Java Development Kit ...

  9. NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plus

    NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plushttps://docs. ...

  10. .net WCF WF4.5

    花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...