codeforces 896A dfs

本文介绍了一种解决无限迭代字符串问题的方法,通过预处理和深度优先搜索算法,在给定层级和位置的情况下快速找到对应的字符。


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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值