#297 (div.2) B. Pasha and String

1.题目描述:点击打开链接

2.解题思路:本题也是一道模拟题,但如果不加一些加速措施会导致TLE。由于两次相同位置的交换等价于没有交换,因此要想办法运用这一性质,减少无所谓的交换操作。首先,统计每个位置出现的次数,同时用a数组存放出现了哪些位置。根据交换的性质,我们只用考虑出现奇数次交换的位置即可。

把出现奇数次的位置放入vector中,如果位置a,,位置b都是出现了奇数次,且中间没有位置需要交换,我们称这种情况叫“位置a,b相邻”。那么对位置a,位置b交换等价于对区间[a,b)中所有的字符进行交换,其他位置不动。这样,便不难写出代码了:先对奇数次的位置排序,每次处理两个相邻位置。如果最后还剩一个位置,单独处理即可。

注:比赛时没有想得这么深入,导致TLE了,==。

3.代码:

#define _CRT_SECURE_NO_WARNINGS #include<iostream>#include<algorithm>#include<string>#include<sstream>#include<set>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<functional>using namespace std;#define N 200000+10char s[N];int m;int a[N];int vis[N];void rev(int len,int st, int en)//交换区间[st,en){for (int i = st; i < en; i++){int pos = len – 1 – i;swap(s[i], s[pos]);}}int main(){//freopen("t.txt", "r", stdin);while (~scanf("%s", s)){memset(vis, 0, sizeof(vis));int len = strlen(s);scanf("%d", &m);int cnt = 0;for (int i = 0; i < m; i++){int x;scanf("%d", &x); x–;if (!vis[x])a[cnt++] = x;vis[x]++;}sort(a, a + cnt);vector<int>tmp;for (int i = 0; i < cnt;i++)if (vis[a[i]] & 1)tmp.push_back(a[i]);int L = tmp.size();int i;for (i = 0; i < L – 1; i += 2)rev(len, tmp[i], tmp[i + 1]);if (i<L)reverse(s + tmp[i], s + len – tmp[i]);printf("%s\n", s);}return 0;}

哪里有意志存在,哪里就会有出路。

#297 (div.2) B. Pasha and String

相关文章:

你感兴趣的文章:

标签云: