超时了几个样例,不知各位有没有改进方法
2025-11-14 15:53:08
发布于:江苏
0阅读
0回复
0点赞
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.length();
vector<int> ans(n + 1, 1);
for (int i = 1; i <= n; i++) {
// 当前前缀
string prefix = s.substr(0, i);
// 找到最小循环同构的起始位置
int min_pos = 0;
string min_str = prefix; // 初始化为原始字符串
// 检查所有可能的起始位置
for (int j = 1; j < i; j++) {
// 构造循环同构字符串
string rotated = prefix.substr(j) + prefix.substr(0, j);
// 比较字典序
if (rotated < min_str) {
min_str = rotated;
min_pos = j;
} else if (rotated == min_str) {
// 如果字典序相同,选择较小的起始位置
if (j < min_pos) {
min_pos = j;
}
}
}
// 注意:min_pos是从0开始的索引,题目要求从1开始
ans[i] = min_pos + 1;
}
// 输出结果
for (int i = 1; i <= n; i++) {
cout << ans[i] << (i < n ? " " : "");
}
cout << endl;
return 0;
}
这里空空如也







有帮助,赞一个