题意:给你一个字符串str ,从1 开始长度为s,每次给你一个 a[i] ,然后将 [ a[i] , (s-a[i]+1) ] 翻转,问你经过n次操作以后整个字符串是什么样的。
解题思路:
1)根据负负得正的思路,我们只需要从内到外,看那些区域需要翻转,那些区域不需要就行了。
解题代码:
1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月27日 星期五 00时33分41秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 200005 26 using namespace std; 27 char str[maxn]; 28 int a[maxn]; 29 int cmp(int a, int b) 30 { 31 return a > b; 32 } 33 int n; 34 void change(int l , int r) 35 { 36 for(int i = l ;i <= r ;i ++) 37 { 38 swap(str[i],str[n-i+1]); 39 } 40 } 41 int main(){ 42 scanf("%s",&str[1]); 43 int m ; 44 n = strlen(&str[1]); 45 scanf("%d",&m); 46 for(int i = 1;i <= m; i ++) 47 scanf("%d",&a[i]); 48 sort(a+1,a+1+m,cmp); 49 int last = n/2; 50 for(int i = 1; i <= m;i ++) 51 { 52 if((m - i) % 2 == 0) 53 { 54 change(a[i],last); 55 } 56 last = a[i] - 1; 57 } 58 puts(&str[1]); 59 return 0; 60 }
2)splay ,我们知道,splay翻转序列只需要logn 所以splay也可以解 .(想法来源是来自于湖大glqAC,被这天大的脑洞吓到了)
Codeforces 525B Pasha and String
原文:http://www.cnblogs.com/zyue/p/4372782.html