| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
回溯+剪枝G++94ms水过,贴个代码#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
struct NumberString{
const char* s;
int len;
int compare(const NumberString& other)const{
int i = 0, j = 0;
for(; s[i] == '0' && i < len; ++i) ;
for(; other.s[j] == '0' && j < other.len; ++j) ;
if(len - i > other.len - j) return 1;
else if(len - i < other.len - j) return -1;
else return strncmp(s+i, other.s+j, len-i);
}
void print()const{
for(int i = 0; i < len; ++i) putchar(s[i]);
}
};
bool betterThan(const vector<NumberString>& a, const vector<NumberString>& b)
{
if(b.empty()) return true;
int res = a.back().compare(b.back()), i = 0;
if(res < 0) return true;
if(res > 0) return false;
for(; i < a.size() && i < b.size(); ++i){
res = a[i].compare(b[i]);
if(res > 0) return true;
if(res < 0) return false;
}
return i < a.size();
}
vector<NumberString> v, r;
void split(const char* s, int i)
{
if(!s[i]){
if(betterThan(v, r)) r = v;
return;
}
int j = i;
for(; s[j] == '0'; ++j) ;
if(!s[j]) return;
NumberString num;
if(!v.empty()){
int k = j;
for(; s[k]; ++k){
num.s = s + j;
num.len = k - j + 1;
if(num.compare(v.back()) > 0) break;
}
if(!s[k]) return;
j = k;
}
for(; s[j]; ++j){
num.s = s + i;
num.len = j - i + 1;
if(!r.empty() && num.compare(r.back()) > 0){//strong cut!!!
break;
}
v.push_back(num);
split(s, j+1);
v.pop_back();
}
}
int main()
{
char s[100];
while(scanf("%s", s), s[1] || s[0] != '0'){
v.clear();
r.clear();
split(s, 0);
if(r.empty()) puts(s);
else{
for(int i = 0; i < r.size(); ++i){
if(i) putchar(',');
r[i].print();
}
putchar('\n');
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator