题目分析:

首先为了简便起见我们把前$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. ZooKeeper: 简介, 配置及运维指南

    1. 概览 ZooKeeper是一个供其它分布式应用程序使用的软件, 它为其它分布式应用程序提供所谓的协调服务. 所谓的协调服务, 是指ZooKeeper的如下能力 naming 命名 configu ...

  2. jdk1.8之线程中断

    在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止.中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 " 线程中断不会使线 ...

  3. win8.1系统下安装ubuntu实现双系统实践教程

    寒假闲来无事,一程序猿哥们给发了一个linux的shell编程指南,看了几张感觉不错.于是装一个试试. 没想到一装才知道了那么的问题. 下面开始: step 1: 软件准备:Ubuntu 系统镜像,这 ...

  4. sort 快排解决百万级的排序

    问题:给n个整数,按从大到小的顺序,输出前m大的整数0<m,n<1000000,每个整数[-500000,500000]输入:5 33 -35 92 213 -644输出:213 92 3 ...

  5. oc之封装「可输入值」的UIStepper

    2017.07.17 18:10* 字数 66 阅读 644评论 0喜欢 5 oc之封装「可输入值」的UIStepper 最终效果 要求: Platform: iOS7.0+ Language: Ob ...

  6. 【kindle笔记】之 《浪潮之巅》- 2018-1-

    <浪潮之巅> 这本书推荐自最爱的政治课老师. 政治课老师张巍老师.我会一直记得你的. 以这样的身份来到这个学校,他人的质疑,自己的忐忑,老板的不公.犹犹豫豫谨小慎微地前进. 第一次听到这样 ...

  7. 社交CRM SCRM

    社交CRM - 国际版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E7%A4%BE%E4%BA%A4CRM 社交CRM ...

  8. Linux的LiveCd与CD、DVD版

    https://blog.csdn.net/sun_168/article/details/6744401

  9. mysql 5.7:show_compatibility_56

    show_compatibility_56 - rudy gao - CSDN博客 https://blog.csdn.net/rudygao/article/details/50403107 [SO ...

  10. .net WCF WF4.5 状态机、书签与持久化

    想看源码请直接翻到最后,使用方式如下图 如果同时需要多个书签可以直接在需要的位置创建书签,会认为是同一个实例. 若需要实现的效果是同时需要好几个部门审核,那么只要在对应的位置同时创建多个书签即可. 编 ...