Codeforces 897C Nephren gives a riddle:模拟【珂学】
题目链接:http://codeforces.com/contest/897/problem/C
题意:
给你一些字符串:
A: [What are you doing at the end of the world? Are you busy? Will you save us?]
B: [What are you doing while sending "]
C: ["? Are you busy? Will you send "]
D: ["?]
(中括号内为给出的字符串,问号、引号、空格也算在内)
定义字符串f[0] = A,递推式f[n] = B + f[n-1] + C + f[n-1] + D
比如:
f[0] = [What are you doing at the end of the world? Are you busy? Will you save us?]
f[1] = [What are you doing while sending "What are you doing at the end of the world? Are you busy? Will you save us?"? Are you busy? Will you send "What are you doing at the end of the world? Are you busy? Will you save us?"?]
然后有q个询问,每个询问有两个整数n,k,让你输出f[n]的第k个字符。如果f[n]没有第k个字符,则输出'.'。
题解:
定义la,lb,lc,ld分别代表字符串A,B,C,D的长度:
la=75, lb=34, lc=32, ld=2
定义len[i]为字符串f[i]的长度,很容易推出len[i] = (2^i)*la + (2^i - 1)*(lb + lc + ld)。
因为len[i]有可能很大,而k只有10^18,所以当i>=54的时候,直接返回一个很大的数就行了(比如9e18)。
对于每个询问,先判断是否k >= len[n]。如果是,直接输出'.'。
否则就从后往前推位置。
因为f[n] = B + f[n-1] + C + f[n-1] + D
所以当前位置k在f[n]中的位置有5种情况:
(1)k在B中,即k∈[1, lb]
(2)k在第一个f[n-1]中,即k∈[lb+1, lb+len[n-1]]
(3)k在C中,即k∈[lb+len[n-1]+1, lb+len[n-1]+lc]
(4)k在第二个f[n-1]中,即k∈[lb+len[n-1]+lc+1, lb+len[n-1]*2+lc]
(5)k在D中,即k∈[lb+len[n-1]*2+lc+1, lb+len[n-1]*2+lc+ld]
对于情况1,3,5,找到k在B,C,D中对应的位置,输出即可:
(1)k不变
(3)k -= lb+len[n-1]
(5)k -= lb+len[n-1]*2+lc
对于情况2,4,将k变成在f[n-1]中的位置,继续执行这种变换即可。
(2)k -= lb
(4)k -= lb+len[n-1]+lc
最多变换n次,所以总复杂度为O(qn)。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; long long n,k,q;
long long la=,lb=,lc=,ld=;
string a=" What are you doing at the end of the world? Are you busy? Will you save us?";
string b=" What are you doing while sending \"";
string c=" \"? Are you busy? Will you send \"";
string d=" \"?";
string s; long long len(long long i)
{
if(i>=) return 9000000000000000000LL;
return ((1LL<<i)-1LL)*(la+lb+lc+ld)+la;
} inline bool cont(long long x,long long l,long long r)
{
return l<=x && x<=r;
} int main()
{
cin>>q;
while(q--)
{
cin>>n>>k;
if(k>len(n))
{
s+=".";
continue;
}
long long form=;
for(long long i=n;i>=;i--)
{
long long temp=len(i-);
bool flag=false;
if(cont(k,,lb)) form=,flag=true;
if(cont(k,lb+temp+,lb+temp+lc)) k-=lb+temp,form=,flag=true;
if(cont(k,lb+temp*+lc+,lb+temp*+lc+ld)) k-=lb+temp*+lc,form=,flag=true;
if(flag) break;
if(cont(k,lb+,lb+temp)) k-=lb;
if(cont(k,lb+temp+lc+,lb+temp*+lc)) k-=lb+temp+lc;
}
if(form==) s+=a[k];
if(form==) s+=b[k];
if(form==) s+=c[k];
if(form==) s+=d[k];
}
cout<<s<<endl;
}
Codeforces 897C Nephren gives a riddle:模拟【珂学】的更多相关文章
- CodeForces - 896A Nephren gives a riddle
A. Nephren gives a riddle time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- Codeforces Round #449 (Div. 2)-897A.Scarborough Fair(字符替换水题) 897B.Chtholly's request(处理前一半) 897C.Nephren gives a riddle(递归)
A. Scarborough Fair time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #449 [ C/A. Nephren gives a riddle ] [ D/B. Ithea Plays With Chtholly ]
PROBLEM C/A. Nephren gives a riddle 题 http://codeforces.com/contest/896/problem/A codeforces 896a 89 ...
- CF&&CC百套计划1 Codeforces Round #449 A. Nephren gives a riddle
http://codeforces.com/contest/896/problem/A 第i个字符串嵌套第i-1个字符串 求第n个字符串的第k个字母 dfs #include<map> # ...
- jzoj5988. 【WC2019模拟2019.1.4】珂学计树题 (burnside引理)
传送门 题面 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_ ...
- JZOJ5988 珂学计树题
题意 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_rund ...
- codeforces 723B Text Document Analysis(字符串模拟,)
题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...
- Codeforces Round #304 C(Div. 2)(模拟)
题目链接: http://codeforces.com/problemset/problem/546/C 题意: 总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张 ...
- Codeforces 749C:Voting(暴力模拟)
http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...
随机推荐
- xfs 文件系统损坏修复 fscheck
- 从零开始学android -- CilpDrawable 徐徐展开的风景
话不多说上图 实现简单利用了这个ClipDrawable clip.xml <?xml version="1.0" encoding="utf-8"?&g ...
- java并发阻塞队列
Java 并发编程利用 Condition 来实现阻塞队列 You are here: 开发&语言 - Java 文章 发布于 2017年06月26日 阅读 944 并发编程 什么是阻 ...
- Dijkstra 算法——计算有权最短路径(边有权值)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 Dijkstra 的思想并用源代码加以实现: 0.2)最短路径算法的基础知识,参见 http://blog. ...
- 002android初级篇之ViewPager及PagerSlidingTabStrip listview的使用
002android初级篇之ViewPager及PagerSlidingTabStrip listview的使用 ViewPager ViewPager类直接继承了ViewGroup类,所有它是一个容 ...
- python带setup.py的包的安装
如psutil-4.2.0.tar.gz tar -zxvf psutil-4.2.0.tar.gz psutil-4.2.0 cd psutil-4.2.0 sudo python setup.py ...
- EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法
EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...
- 鼠标画矩形openCV
#include <cv.h> #include <highgui.h> #include <stdio.h> /*鼠标画矩形*/ void my_mouse_ca ...
- iOS 添加震动效果
开发过程中,有时候会碰到点击按钮或者某个动画会配合震动效果:下面介绍iOS开发过程中的震动添加: 导入:#import <AudioToolbox/AudioToolbox.h> 在需要出 ...
- Python菜鸟之路:Python基础(三)
一.编码 推荐阅读<字符编码的前世今生>:http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201307/ ...