题意
输入整数T表示有T个测试用例,然后
• 给一个01构成的字符串,要把该字符串切分成最少的份数,使得每一个字符串都是循环移位字典序最小的字符串。(例如0110就不满足字典序最小,因为循环移位可得0011)
• 111011110 -> 111 01111 0
题解
每次暴力枚举最少的字符串,暴力判断是否符合条件即可。
Code
#include<bits/stdc++.h> using namespace std; bool check(string s) { int n=s.size(); for(int i=1;i<n;i++){ //i从下标1起,比较将位置i作为第一位的字符串和原字符串的字典序大小 for(int j=0;j<n;j++){ //新旧两组字符串进行逐个比较 if(s[j]<s[(i+j)%n]) break; else if(s[j]>s[(i+j)%n]) return false; } } return true; } int main() { int T; cin>>T; while(T--) { string a; cin>>a; int len=a.size(); int i=0; while(i<len){ for(int j=len-i;j>0;j--){ if(check(a.substr(i,j))){ cout<<a.substr(i,j); i+=j; if(i<len)cout<<' '; break; } } } cout<<endl; } return 0; }