- dp1来枚举最后一位数最短长度
- dp2来最小的第一个数
#include<cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define fst first
#define sec second
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcopy(a,b,sizeof b)
typedef long long LL;
typedef pair<int,int> P;
const int MAX_N = 110;
const int MAX_M = 10000;
int dp1[MAX_N],dp2[MAX_N];
char
str[MAX_N];
char
s[2][MAX_N];
bool judge(int i,int j,int m,int n) {
while (str[i] == '0' && i <= j) i++;
while (str[m] == '0' && m <= n) m++;
if (i > j) return false;
if (m > n) return true;
if (j - i > n - m) return true;
else if (j - i < n - m) return false;
for (int k = i;k <= j;k++) {
s[0][k - i] = str[k];
}
s[0][j - i + 1] = '\0';
for (int k = m;k <= n;k++) {
s[1][k - m] = str[k];
}
s[1][n - m + 1] = '\0';
if (strcmp(s[0],s[1]) > 0) {
return true;
} else {
return false;
}
}
int main() {
while (~scanf("%s",str + 1)){
int len = strlen(str + 1);
if (len == 1 && str[1] == '0') break;
for (int i = 1;i <= len;i++) {
dp1[i] = i;
for (int j = i - 1;j >= 1;j--){
if (judge(j+1,i,j - dp1[j] + 1,j)){
dp1[i] = i -j;
break;
}
}
}
int t = len - dp1[len] + 1;
dp2[t] = dp1[len];
for (int i =t - 1;i >= 1;i--) {
if (str[i] == '0') {
dp2[i] = dp2[i + 1] + 1;
continue;
}
for (int j = t;j > i;j--) {
if (judge(j,j+dp2[j]-1,i,j-1)) {
dp2[i] = j - i;
break;
}
}
}
for (int i = 1;i <= dp2[1];i++)
putchar(str[i]);
int pp = dp2[1] + 1;
while (pp <= len) {
putchar(',');
for (int i = pp;i < pp + dp2[pp];i++) {
putchar(str[i]);
}
pp = pp + dp2[pp];
}
putchar('\n');
}
return 0;
}