Str
作者:互联网
对于字符串 \(s\) 定义一个变换 \(f(s)\) 表示, \(∀1≤k≤⌊|s|/2⌋\) ,将 \(s\) 中从后往前第 \(k\) 个字符插入从前往后第 \(k\) 个字符和第 \(k+1\) 个字符之间后得到的字符串,例如 abcdef 变换后得到 afbecd 。
现在给出用 \(f(s)\) 变换过 \(k\) 次以后的字符串(即执行 \(k\) 次 \(s:=f(s)\)),求变换之前的字符串。
输入格式
第一行一个整数 \(k\) 。
第二行一个字符串 \(s\) 。
输出格式
输出 \(k\) 次变换之前的字符串。
样例输入
4
acefdb
样例输出
abcdef
数据范围
时限1s 空间256M
对于 50% 的数据, \(k≤100\) 。
对于 100% 的数据, \(1≤k≤10^9,3≤|s|≤10^3\) 。
既然是要往前找,所以操作改为把奇数位和偶数位的数分开,奇数位的倒着插入回去。
看到\(k\)那么大,就知道肯定是有规律的,所以如果出现一个和第一个相同的字符串就不用找了。最后用k模周期长度,找到那个字符串。
#include<iostream>
using namespace std;
string s[1005],t;
int k;
int main()
{
cin>>k>>s[0];
for(int i=1;;i++)
{
t="";
for(int j=0;j<s[i-1].size();j+=2)
t.push_back(s[i-1][j]);
for(int j=s[i-1].size()-1;j>=0;j--)
if(j&1)
t.push_back(s[i-1][j]);
if(t==s[0])
{
cout<<s[k%i];
return 0;
}
s[i]=t;
}
}
标签:10,int,变换,Str,字符串,abcdef,个字符 来源: https://www.cnblogs.com/mekoszc/p/16181411.html