Nephren gives a riddle
题目要求在一个无限迭代的字符串中在第n层找到第k个字母。
f(x) = sb + f(x - 1) + sc + f(x - 1) + sd
预处理出不超过范围的最大层。则下一层大于这一层的两倍。
dfs
如果在预处理层之内,且k大于该层长度,则返回 ‘.’
如果在第0层,返回原串位置
如果在sb之内,返回sb的字母
如果在f(x-1)内,递归处理;注意如果层数大于预处理的最大层,则只会在这前两个范围内。且如果要跟f()数组比较,要判断是否在预处理的层数之内
sc字符串即后面类似处理。
#include <bits/stdc++.h>
using namespace std;
char sa[] = "What are you doing at the end of the world? Are you busy? Will you save us?";
char sb[] = "What are you doing while sending \"";
char sc[] = "\"? Are you busy? Will you send \"";
char sd[] = "\"?";
typedef long long ll ;
ll len[100] , pos , lena , lenb , lenc , lend;
void init(){
lena = strlen(sa) ;
lenb = strlen(sb) ;
lenc = strlen(sc) ;
lend = strlen(sd) ;
len[0] = lena ;
pos = 0 ;
while(len[pos] <= 1e18){
len[++ pos] = lenb + len[pos - 1] + lenc + len[pos - 1] + lend ;
}
}
char dfs(ll n , ll k){
if(n <= pos && k > len[n] ) return '.' ;
if(n == 0) return sa[k - 1] ;
if(k <= lenb) return sb[k - 1] ;
k -= lenb ;
if(n > pos || k <= len[n - 1]) return dfs(n - 1 , k) ;
k -= len[n - 1] ;
if(k <= lenc) return sc[k - 1] ;
k -= lenc ;
if(k <= len[n - 1]) return dfs(n - 1 , k) ;
k -= len[n - 1] ;
return sd[k - 1] ;
}
int main(){
ll op ; scanf("%lld" , &op) ;
ll n , k ;
init() ;
while(op -- ){
scanf("%lld %lld" , &n , &k) ;
printf("%c" , dfs(n , k)) ;
}
puts("") ;
return 0 ;
}
本文介绍了一种解决无限迭代字符串问题的方法,通过预处理和深度优先搜索算法,在给定层级和位置的情况下快速找到对应的字符。
534

被折叠的 条评论
为什么被折叠?



