您的位置:首页 > 其它

usaco Letter Game

2015-10-02 21:15 309 查看
先计算出每个单词的值,如果单词不合法则为-1,同时找出最大的单词。

然后输出。

/*
ID: modengd1
PROG: lgame
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
int value[257];
int f[256];
bool useful[256];
bool legal[40000];
int valueofworde[40000];
int cal(string S,string S2)//次单词是否合法,不合法返回-1,合法返回这个词的值
{
int counter[256];
memset(counter,0,sizeof(counter));
int ret=0;
for(int i=0;i<S.size();i++)
{
counter[S[i]]++;
if(!useful[S[i]]||counter[S[i]]>f[S[i]])
return -1;
ret+=value[S[i]];
}
for(int i=0;i<S2.size();i++)
{
counter[S2[i]]++;
if(!useful[S2[i]]||counter[S2[i]]>f[S2[i]])
return -1;
ret+=value[S2[i]];
}
return ret;
}
void init()
{
value['q']=value['j']=value['x']=value['z']=7;
value['w']=value['f']=value['k']=value['v']=6;
value['e']=value['s']=value['i']=1;
value['r']=value['t']=value['a']=value['n']=2;
value['o']=value['l']=3;
value['u']=value['d']=value['c']=4;
value['p']=value['g']=value['b']=value['m']=value['y']=value['h']=5;
}
int main()
{
freopen("lgame.in","r",stdin);
freopen("lgame.out","w",stdout);
init();
vector<string> dict;
char ch;
int maxvalue=0;
char temp[10];
FILE *in2 = fopen ("lgame.dict", "r");
vector<int> index[43];//单词值为i的单词在字典中的位置
memset(useful,false,sizeof(useful));
memset(f,0,sizeof(f));
while(~scanf("%c",&ch))
{
useful[ch]=true;
f[ch]++;
}
for(int i =0;~fscanf(in2,"%s",temp);i++)
{
if(temp[0]=='.')
break;
dict.push_back(temp);
valueofworde[i]=cal(temp,"");
if(valueofworde[i]!=-1)
index[valueofworde[i]].push_back(i);
maxvalue=max(maxvalue,valueofworde[i]);
}
for(int i=1;i<=42;i++)
{
for(int j=0;j<index[i].size();j++)
{
for(int k=0;k<=42;k++)
{
for(int m=0;m<index[k].size();m++)
{
maxvalue=max(maxvalue,cal(dict[index[i][j]],dict[index[k][m]]));
}
}
}
}
cout<<maxvalue<<endl;
for(int i=0;i<dict.size();i++)
{
if(valueofworde[i]==maxvalue)
cout<<dict[i]<<endl;
else
{
int other=maxvalue-valueofworde[i];
for(int j=0;j<index[other].size();j++)
{
if(index[other][j]>=i&&cal(dict[index[other][j]],dict[i])==maxvalue)
{
cout<<dict[i]<<' '<<dict[index[other][j]]<<endl;
}
}
}
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: