求调,递归思路
查看原帖
求调,递归思路
1373219
acommonman楼主2024/12/6 16:21
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
char s[200001];
ll l=0,num=0;
ll pd2(int k){
    int a = 1;
    while(l*a < k){
        a *= 2;
        num++;
    }
    return a; 
}

ll dfs(ll k){
    ll m = pd2(k);
    ll x = k - l*(m/2);
    if(m == 1)return x;
    return dfs(x);
}

void solve(ll k){
    int index = dfs(k) - 1;

    if((num - 1) % 2)//如果是奇数次变化的字符串,则不变
        printf("%c ", s[index]);
    else {//偶数次,变化了
        if('a' <= s[index]&& 'z' >= s[index])
            printf("%c ", s[index] - 32);
        else printf("%c ",s[index] + 32);
    }num=0;
}

int main(){
    int q = 0;
    scanf("%s", s);
    scanf("%d", &q);
    l=strlen(s);
    for(int i = 1; i <= q; i++){
        ll k;
        scanf("%lld", &k);
        solve(k);
    }
    return 0;
}

思路: 1.找到最小的m,使k <= 2^m && k > 2^(m-1)

2.令k - 2^(m-1) 为新的递归参数,重复第一步直到 k - 2^(m-1) 比字符串长度小

3.最后判断字符串变化次数的奇偶性,奇数次不变,偶数次改变

2024/12/6 16:21
加载中...