我在Codeforces问题上遇到了超出时限的错误(测试案例#28)。
链接为http://codeforces.com/problemset/problem/525/B 解决方案无处可在谷歌上找到。 有没有人知道如何更快地使这个解决方案。
我的代码是:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
int main() {
char str[2000005];
scanf("%s", &str);
long long l = strlen(str);
long long k, i, j, days, pos, counter = 0;
scanf("%I64d", &days);
for (k = 1; k <= days; k++) {
f:
cin >> pos;
counter++;
i = pos - 1;
j = l - pos;
// swap(str[pos - 1], str[l - pos])
start:
swap(str[i], str[j]);
i++;
j--;
if (i <= j)
goto start;
else if (i > j && counter < days)
goto f;
else if(counter==days)
break;
}
printf("%s", str);
return 0;
}
答案 0 :(得分:0)
我解决这个问题的方法:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
int m, i, a[200002];
cin >> s >> m;
while (m--) {
cin >> i;
a[i]++;
}
int net = 0, n = s.length();
for (int i = 1; 2 * i <= n; i++) {
net += a[i];
if (net % 2) swap(s[i - 1], s[n - i]);
}
cout << s;
return 0;
}
建议:
goto
,请使用for
或while
long long
是不必要的编辑:每次都不需要反转字符串。我们需要计算在字符串的每个位置开始的反转次数。请阅读此blog entry了解更多信息。