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 |
太弱了。做了这么长时间。写的还烂。。#include <string.h> #include <stdio.h> #include <iostream> using namespace std; struct lint { int l,r; int len; }; lint INF; char s[100]; bool vis[100]; lint f[100][100]; bool operator == (const lint &a, const lint &b) { if(a.len != b.len) return false; for(int i = a.l,j = b.l; i <= a.r && j <= b.r; i++,j++) if(s[i] != s[j]) return false; return true; } bool operator < (const lint &a, const lint &b) { if(a.len != b.len) return a.len < b.len; for(int i = a.l,j = b.l; i <= a.r && j <= b.r; i++,j++) if(s[i] != s[j]) return s[i] < s[j]; return s[a.l] < s[b.l]; } inline lint get(int l , int r) { lint res; while(l < r && s[l] == '0') l++; res.l = l; res.r = r; res.len = r-l+1; return res; } inline void find(int i, int j) { if(i == 0) return; for(int k = j-1;k >= 1; k--) if(f[i-1][k] < f[i][j] && get(k+1,j) == f[i][j]) { vis[k] =true; find(i-1,k); return; } } int main() { INF.len = 1000; INF.l = INF.r = 0; while(1) { memset(vis,false,sizeof vis); scanf("%s",s+1); int n = strlen(s+1); if(n==1 && s[1] == '0') break; for(int i = 0; i <= n; i++) for(int j = 0; j <= n; j++) f[i][j] = INF; f[0][0].len = -100; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) for(int k = 0;k < n; k++) if(f[i-1][k].len != 1000) { lint now = get(k+1,j); if(f[i-1][k] < now) f[i][j] = f[i][j] < now ? f[i][j] : now; } int k; lint ans = INF; for(int i = 1; i <= n; i++) if(f[i][n] < ans) { ans = f[i][n]; k = i; } find(k,n); for(int i = 1; i <= n; i++) { putchar(s[i]); if(vis[i]) putchar(','); } puts(""); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator