其他分享
首页 > 其他分享> > Str

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