暴力swap导致TLE问题解决办法

B. Pasha and String

题目很简单,就是将字符串中从某一位置到另一位置之间的片段逆序,基本思路就是利用swap两两交换。这时候题目会出现问题就是超时Time limit exceeded ,两两交换太过于耗费时间,原因在于中间有交换过去又交换回来相当于没做改变的交换浪费了时间,有没有更好的办法呢?因为颠倒的都是中间的数,所以可以统计片段中每个字母颠倒的次数,若为奇数次则交换;偶数次则不交换。还有一个地方注意,因为题目当中提示了,每次的ai小于等于二分之一倍的字符串的长度,所以统计颠倒次数的时候循环变量到达字符串长度的一半即可。因为是片段,片段中间的字符都要颠倒,所以有a[i] += a[i - 1],之前也有过类似的统计方法,应该学会。

 1 #include<iostream>
 2 #include <string>
 3 using namespace std;
 4 int a[100005];
 5 int main() 
 6 {
 7     string s;
 8     cin >> s;
 9     int len = s.size();
10     int m;
11     cin >> m;
12     for (int i = 0; i < m; i++) 
13     {
14         int t;
15         cin >> t;
16         a[t]++;
17     }
18     for (int i = 1; i <= len / 2; i++) 
19         a[i] += a[i - 1];
20     for (int i = 0; i <= len / 2; i++) 
21     if (a[i] & 1) 
22         swap(s[i-1], s[len - i]);
23     cout << s << endl;
24     return 0;
25 }

  

  

原文地址:https://www.cnblogs.com/jzwong/p/4413700.html