###题目大意:
一个长度为n的字符串,有k次操作,每次把范围为1-d(d是n的因子,且d从大到小)的子字符串翻转。
现在给你k次翻转后的结果,要求输出原来的字符串。
###解题思路:
给出结果求原串,操作的过程翻转一下就可以。原来是d递减,那么现在递增,一开始不知道reverse()函数,拿模拟写了。。。用reverse()函数好简单。。
模拟代码:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
typedef long long ll;
using namespace std;
int main()
{
/* std::ios::sync_with_stdio(false);
cin.tie(0);
freopen("test.txt","r",stdin);
freopen("output.txt","w",stdout);*/
int n;
char a[110];
cin>>n;
cin>>a;
if(n==1)cout<<a[0]<<endl;
else
{
for(int i=2;i<=n;i++)
{
if(n%i==0)
{
int l=0,r=i-1;//左右边界
while(l<=r)
{
swap(a[l],a[r]);//交换
l++;
r--;
}
}
}
cout<<a<<endl;
}
}
用reverse()函数,核心代码两行。。。
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
typedef long long ll;
using namespace std;
int main()
{
/* std::ios::sync_with_stdio(false);
cin.tie(0);
freopen("test.txt","r",stdin);
freopen("output.txt","w",stdout);*/
int n;
string s;
cin>>n>>s;
for(int i=2;i<=n;i++)
{
if(n%i==0)reverse(s.begin(),s.begin()+i);
}
cout<<s<<endl;
}