A.1 | B | C | D | E | F | G |
AC |
A1.Gardener and the Capybaras (easy version)
字典序 + 循环跳出(break*2)
#include <iostream>
using namespace std;
bool check(string a, string b, string c) {//string已经字典序
if ((a <= b && c <= b) || (b <= a && b <= c)) return 1;
return 0;
}
void solve(){
string s, a, b, c;
cin >> s;
int n =s.size(), flag = 0;
for (int i = 1; i <= n-2; i++) {
if (flag) break;
a = s.substr(0, i);
for (int j = 1; j <= (n-1-i); j++) {
b = s.substr(i, j);//string类:(起点,长度)
c = s.substr(i+j, n-(i+j));
if (check(a, b, c)) {
flag = 1;
break;//break只能跳出一层循环,所以:判两次flag
}
}
}
if (flag) cout << a << " " << b << " " << c << endl;
else puts(":(\n");
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
A2 - Gardener and the Capybaras (hard version)
时间复杂度度提升:规律(一定有答案,string b是关键,'a' / 'b')
#include<iostream>
using namespace std;
const int N = 110;
int t;
bool fun(string a, string b, string c)
{
if((b >= a && b >= c) || (b <= a && b <= c)) return 1;
return 0;
}
int main()
{
cin >> t;
while(t --)
{
string s;
cin >> s;
bool f = 0;
int n = s.size();
string s1, s2, s3;
for(int i = 1; i <= n - 2; i ++)
{
if(s[i] == 'a')//string b有’a'
{
f = 1;
s1 = s.substr(0, i);
s2 = "a";
s3 = s.substr(i+1, n-i);
break;
}
}
if(!f)
{
int p = 0;
for(int i = 1; i <= n-2; i ++)
{
if(s[i] == 'b')//string b只有‘b'
{
p = i;
break;
}
}
if(p)
{
f = 1;
s1 = s.substr(0, p);
s2 = s.substr(p, n-1-p);
s3 = s.substr(n-1, 1);
}
}
if(f) cout << s1 << " " << s2 << " "<< s3 <<endl;
if(!f) puts(":(");
}
return 0;
}