poj 1171 Letter Game
#include <iostream>
#include <string>
using namespace std;
struct node
{
char words[10];
int len,val;
}dic[40010];
int c_fre[26],value[26] = {2,5,4,4,1,6,5,5,1,7,6,3,5,2,3,5,7,2,1,2,4,6,6,7,5,7};
char coll[10],lett[10];
int to_value(char ch[])
{
int s=0;
for(int i=0;i<strlen(ch);++i)
s+=value[ch[i]-97];
return s;
}
bool add(int list[],char ch[])
{
for(int i=0;i<strlen(ch);++i)
{
int tmp=ch[i]-97;
list[tmp]++;
if(list[tmp]>c_fre[tmp])
return false;
}
return true;
}
int main()
{
int i,j;
scanf("%s",coll);
int c_v=to_value(coll),c_len=strlen(coll);
for(i=0;i<c_len;++i)
c_fre[coll[i]-97]++;
int m_val=0,t=0,arr[26];
while(scanf("%s",lett)&&strcmp(lett,".")!=0)
{
int d_len=strlen(lett),w=to_value(lett);
if( d_len>c_len || w>c_v )
continue;
memset(arr,0,sizeof(arr));
if(!add(arr,lett))
continue;
if(m_val<w) m_val=w;
if( (c_len==6&&d_len==3) || (c_len==7&&d_len<=4) )
//单词长度范围在3--7内.所以可能的词组只能是 3+3 或 3+4 ,最多只能由两个组成;也就是说那些长度大于4的词组不用存储
{
strcpy(dic[t].words,lett);
dic[t].len=d_len;
dic[t].val=w;
t++;
}
}
if(c_len>=6&&m_val<c_v)
{
for(i=0;i<t;++i)
for(j=0;j<t;++j)
{
int i_v=dic[i].val,j_v=dic[j].val;
if( dic[i].len+dic[j].len>c_len || i_v+j_v>c_v )
continue;
memset(arr,0,sizeof(arr));
if(!add(arr,dic[i].words))
continue;
if(!add(arr,dic[j].words))
continue;
m_val=max(m_val,i_v+j_v);
}
}
printf("%d\n",m_val);
return 0;
}