zoukankan      html  css  js  c++  java
  • 洛谷【P3612】[USACO17JAN]Secret Cow Code秘密奶牛码

    我对分治的理解:https://www.cnblogs.com/AKMer/p/9728574.html

    题目传送门:https://www.luogu.org/problemnew/show/P3612

    因为每次操作都会使原串增长一倍,并且后半部分与前半部分极其相似,所以我们可以将其分治。

    因为是将原串的最后一个字符放到第一个来,其余字符全部后移一位,所以在后一半的第(i)位就是前一半的第(i-1)位,如果是后一半的第(1)位,那么就是前一半的第(len)位。我们每次分治可以将串长减少一半,所以只需要(logn)的时间就可以将询问的位数减小至最开始的原串长度以内,就可以直接出结果了。

    时间复杂度:(O(logn))

    空间复杂度:(O(1))

    代码如下:

    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define ll long long
    
    ll n;
    int len;
    char s[35];
    
    char find(ll id) {
        if(id<=len)return s[id];//如果到初始串内了就直接返回答案
        ll tmp=len;
        while((tmp<<1)<id)tmp<<=1;//tmp就是前半部分的长度
        ll new_id=id-tmp-1;if(!new_id)new_id=tmp;//new_id是id位在前半部的位置
        return find(new_id);//递归去找
    }
    
    int main() {
        scanf("%s%lld",s+1,&n);
        len=strlen(s+1);
        printf("%c",find(n));//找第n为
        return 0;
    }
    
  • 相关阅读:
    软件包管理(rpm&yum)
    文本处理三剑客之sed
    压缩归档tar
    linux文件查找find
    vim编辑器
    正则表达式
    文本处理三剑客之grep
    常用文本处理、统计工具
    文件权限管理
    用户和组管理
  • 原文地址:https://www.cnblogs.com/AKMer/p/9734747.html
Copyright © 2011-2022 走看看