xfstart07
Get busy living or get busy dying

/*
0.062     1485 KB
*/
#include
< iostream >
using   namespace  std;

int  N;
const   char   * d = " 22233344115566070778889990 " ;
char  a[ 110 ];
char  s[ 50001 ][ 55 ];
int  ans[ 110 ];
int  f[ 110 ];
bool  check( int  x, int  y){
    
int  len = strlen(s[y]);
    
for ( int  i = 0 ;i < len; ++ i)
        
if (a[x - i] != d[s[y][len - i - 1 ] - ' a ' ])
            
return   0 ;
    
return   1 ;
}
void   out ( int  len){
    
if ( ! len)  return ;
    
out (len - strlen(s[f[len]]));
    
if (len == strlen(a)) 
        printf(
" %s\n " ,s[f[len]]);
    
else
        printf(
" %s  " ,s[f[len]]);
}
int  main()
{
    
while ( 1 ){
        gets(a);
        
if (strcmp(a, " -1 " ) == 0 break ;
        scanf(
" %d " , & N); getchar();
        
for ( int  i = 0 ;i < N; ++ i)
            gets(s[i]);
        memset(ans,
0x7F , sizeof (ans));
        memset(f,
- 1 , sizeof (f));
        ans[
0 ] = 0 ;
        f[
0 ] = 0 ;
        
for ( int  i = 0 ;i < strlen(a); ++ i)
            
for ( int  j = 0 ;j < N; ++ j)
                
if (i + 1 >= strlen(s[j]) && a[i] == d[s[j][strlen(s[j]) - 1 ] - ' a ' ])
                    
if (ans[i + 1 ] > ans[i + 1 - strlen(s[j])] && check(i,j)){
                        ans[i
+ 1 ] = ans[i + 1 - strlen(s[j])] + 1 ;
                        f[i
+ 1 ] = j;
                    }
        
if (f[strlen(a)] ==- 1 ) printf( " No solution.\n " );
        
else   out (strlen(a));
    }
    
return   0 ;
}

解法二:
/*
0.046
*/
#include
<iostream>
using namespace std;

int N;
const char *d="22233344115566070778889990";
char map[110][110][256];
char sol[110][256];
char s[256];
int f[110];
void check(int x,char *y){
    
for(int i=0;i<strlen(y);++i)
        
if(s[x-i-1]!=d[y[strlen(y)-i-1]-'a'])
            
return;
    strcpy(map[x][strlen(y)],y);
}
int main()
{
    gets(s);
    scanf(
"%d",&N); getchar();
    
for(int i=0;i<=strlen(s);++i){
        sol[i][
0]=0;
        
for(int j=0;j<=strlen(s);++j)
            map[i][j][
0]=0;
    }
    
char ch[255];
    
for(int i=1;i<=N;++i){
        gets(ch);
        
for(int j=strlen(ch);j<=strlen(s);++j)
            check(j,ch);
    }
    f[
0]=0;
    
for(int i=1;i<=strlen(s);++i){
        
if(strlen(map[i][i])==0){
            f[i]
=256;
            strcpy(ch,sol[i]);
            
for(int j=1;j<i;++j)
                
if(f[i]>f[j]+1&&strlen(map[i][i-j])>0){
                    f[i]
=f[j]+1;
                    strcpy(ch,sol[i]);
                    strcat(ch,sol[j]);
                    strcat(ch,
" ");
                    strcat(ch,map[i][i
-j]);
                }
            strcpy(sol[i],ch);
        }
        
else{
            f[i]
=1;
            strcpy(sol[i],map[i][i]);
        }
    }
    
if(strlen(sol[strlen(s)])>0)
        printf(
"%s\n",sol[strlen(s)]);
    
else
        printf(
"No solution.\n");
    
return 0;
}

posted on 2009-05-25 15:43 xfstart07 阅读(305) 评论(0)  编辑 收藏 引用 所属分类: 代码库

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理