间隙妖怪(gap.cpp/c/pas)
题目描述:
八云紫是幻想乡的间隙妖怪。她喜欢和八云橙玩一个叫做翻转的游戏。具体规则如下,八云紫对一个长度为N字符串做M次翻转操作,每次操作给定一个X,八云紫将X到N-X之间的字符串翻转。她最喜欢的就是在做M次操作之前询问八云橙这个字符串会变成什么样。然而愚钝的橙一般是答不出来的。为了让橙不在紫妈面前丢脸,你能够帮帮她吗?
输入数据:
第一行:一个字符串(即原字符串)
第二行:一个整数M,表示有M次操作
第三行:M个整数,表示每次操作的X
输出数据:
一个字符串,表示M次操作之后的字符串。
输入样例:
abcdef
1
2
输出样例:
aedcbf
数据范围:
对于50%数据:M<=5000,字符串长度<=5000
对于100%数据:M<=200000,字符串长度<=200000
字符串处理,可以联想到用异或^来处理字符串反转
因为反转两遍相当于没转,所以得到了以下的东西QAQ
//二进制下异或不同的为1,相同的为0
//NOIP不让用这玩意儿
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 200005 using namespace std; int a[maxn],tmp,m; char s[maxn],ans[maxn]; int main() { freopen("gap.in","r",stdin); freopen("gap.out","w",stdout); scanf("%s%d",s+1,&m); int n=strlen(s+1); for(int i=1;i<=m;++i) { scanf("%d",&tmp); a[tmp]^=1; a[n-tmp+2]^=1; } tmp=0; for(int i=1;i<=n;++i) { tmp^=a[i]; if(tmp) ans[i]=s[n-i+1]; else ans[i]=s[i]; } ans[n+1]='