https://ac.nowcoder.com/acm/contest/887/A
题意:给定一个字符串 把他分割成最小字符串组成的多个串 数量要求最少
最小字符串:通过旋转(第一个字符到最后面去)得到最小的字符串
比如011 最小是011
010 最小是001
0101 最小是0101
注意这个题 是求最少的分割数量 比赛的时候卡住了 比赛结束3分钟就AC了。。。
其实可以贪心 直接暴力最长的串是不是最小 不是的话ed--(st初始为0 ed初始为s的长度-1) 一直减 直到遇到那个最长的最小字符串 然后更新st为ed+1 ed初始化
以此往复 直到输出全部字符串
#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<cstring>
using namespace std;
const int maxn = 1005;
typedef long long ll;
bool judge(string a) {
if (a.length() == 1) return true;
int len = a.length();
string ans = a;
string b = a;
for (int i = 0; i < a.length(); i++) {
char c = a[len - 1];
a.erase(a.end() - 1);
a = c + a;
ans = min(ans, a);
}
if (ans == b)
return true;
else
return false;
}
int main() {
int t;
cin >> t;
string s;
int st, ed;
while (t--) {
cin >> s;
int st = 0, ed = s.length()-1;
while (st <= ed) {
if (judge(s.substr(st, ed - st+1)) == true) {
cout << s.substr(st, ed - st+1)<<' ';
st = ed + 1;
ed = s.length() - 1;
}
else {
ed--;
}
}
cout << endl;
}
return 0;
}







Comments | NOTHING