递推与递归篇二
递归
Secret Cow Code S
题目链接:Secret Cow Code S
解题思路
如果我们按照正常的递归思路写,如下代码,由于n太大,会tle。
void solve(string ss){
long long len = ss.size();
if(len >= n){
ans = ss[n-1];
return ;
}
tp = ss[len-1];
tp += ss.substr(0,len - 1);
ss += tp;
solve(ss);
}
因此我们需要换一个思路,由题目我们知道生成的字符的后半段与前一半是有联系的。因此我们可以思考如何将位置n的字符减小到原字符串中的位置。首先我们先不考虑增加字符串的额外操作,就只是把前半部分复制到后半部分,如果n在后半部分的话,如果总长度是T,那么将n 与 n - T/2 位置的子符串是一样的。由于题目是先将最后的字符串移到最前边,因此就是 n - 1 - T/2 . 同时还有一个特殊情况,如果n是后半部分的第一个位置,那么就应该是 n = T/2;
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s,tp;
long long n ,len ,t;
int main(){
cin>>s>>n;
len = t = s.size();
while

最低0.47元/天 解锁文章
2465

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



