RT,第一个是TLE代码,第二个是AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#define MAXN 131100
#define INF 10000000
using namespace std;
char str[MAXN];
int cnt[MAXN][30];
int n, T;
inline int dfs(int l, int r, int col) {
if (l == r) {
if (cnt[r][col] - cnt[l - 1][col] == 0)
return 1;
return 0;
}
int mid = (l + r) >> 1, len = r - l + 1;
int a = dfs(mid + 1, r, col + 1), b = dfs(l, mid, col + 1);
return min(len / 2 - (cnt[mid][col] - cnt[l - 1][col]) + a, len / 2 - (cnt[r][col] - cnt[mid][col]) + b);
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d %s", &n, str + 1);
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 26; j++) {
if (str[i] - 'a' + 1 == j)
cnt[i][j] = cnt[i - 1][j] + 1;
else
cnt[i][j] = cnt[i - 1][j];
}
}
printf("%d\n", dfs(1, n, 1));
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#define MAXN 131100
#define INF 10000000
using namespace std;
char str[MAXN];
int cnt[MAXN][30];
int n, T;
inline int dfs(int l, int r, int col) {
if (l == r) {
if (str[r] - 'a' + 1 != col)
return 1;
return 0;
}
int mid = (l + r) >> 1, len = r - l + 1;
int a = dfs(mid + 1, r, col + 1), b = dfs(l, mid, col + 1);
int Ans1 = 0, Ans2 = 0;
for (int i = l; i <= mid; i++) if (str[i] - 'a' + 1 == col) Ans1++;
for (int i = mid + 1; i <= r; i++) if (str[i] - 'a'+ 1 == col) Ans2++;
return min(len / 2 - Ans1 + a, len / 2 - Ans2 + b);
}
int main() {
cin >> T;
while (T--) {
cin >> n >> str + 1;
printf("%d\n", dfs(1, n, 1));
}
return 0;
}
是不是memset太慢了?如果是,memset的时间复杂度又该怎么计算?
有没有巨佬救救这位退役近一年的新高一菜鸡?