题目链接:http://poj.org/problem?id=1732
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int dp[110],pre[110],n;
char num[110];
char word[50010][55];
char a[60];
int path[110],ans[110];
int turn[30]={2,2,2,3,3,3,4,4,1,1,5,5,6,6,0,
7,0,7,7,8,8,8,9,9,9,0};
map<string,int>mp;
int tmp;
int main()
{
int l,i,j;
while(scanf("%s%d",num,&n)!=EOF)
{
int len=strlen(num);
mp.clear();
for(i=1;i<=n;i++)
{
scanf("%s",word[i]);
l=strlen(word[i]);
for(j=l-1;j>=0;j--)
a[l-j-1]=turn[word[i][j]-'a']+'0';
a[l]=0;
mp[a]=i;
}
for(i=0;i<=len;i++)
dp[i]=inf;
dp[0]=0;
for(i=1;i<=len;i++)
{
memset(a,0,sizeof(a));
int cnt=0;
for(j=i-1;j>=0&&i-j<=55;j--)
{
a[cnt++]=num[j];
if(dp[j]==inf)
continue;
tmp=mp[a];
if(tmp)
{
if(dp[j]+1<dp[i])
{
path[i]=tmp;
pre[i]=j;
dp[i]=dp[j]+1;
}
}
}
}
if(dp[len]==inf)
printf("No solution.\n");
else
{
tmp=len;
int cnt=0;
for(i=dp[len];i>0;i--)
{
ans[cnt++]=path[tmp];
tmp=pre[tmp];
}
for(i=cnt-1;i>0;i--)
printf("%s ",word[ans[i]]);
printf("%s\n",word[ans[0]]);
}
}
}