您的位置:首页 > 其它

usaco 4.3 Letter Game 搜索

2008-08-24 09:36 281 查看
简单搜索题,几乎不需要优化,直接枚举一个或者两个单词,判断其组成字符的个数是否小于给定串对应的字符个数,满足则更新答案。搜索过程中如果需要单词里的字符不再给定串里,则提前跳出。

/*

PROG: lgame

LANG: C++

ID: heben991

*/

#include <iostream>

#include <algorithm>

using namespace std;

const int N = 60010, M = 12, L = 30;

const int value[L]={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 dict
[M], *ans
[2];

int len, n, size, l
;

int num[L], h1[L],h2[L];

int sum_value(int k)

{

int i, sum=0;

for(i = 0; i < l[k]; ++i) sum += value[dict[k][i]-'a'];

return sum;

}

int main()

{

int i, j, k, t, sum, v1, v2, ma=0;

char s[M],s1[M],s2[M],ch,*c;

freopen("lgame.dict","r",stdin);

freopen("lgame.out","w",stdout);

while(1)

{

gets(dict
);

if(dict
[0]=='.')break;

l
= strlen(dict
);

++n;

}

freopen("lgame.in","r",stdin);

gets(s);

len = strlen(s);

for(i = 0; i < len; ++i) num[s[i]-'a']++;

for(i = 0, sum = 0; i < len; ++i)

sum += value[s[i]-'a'];

for(i = 0; i < n; ++i)

{

if(l[i] > len) continue;

{

for(k = 0; k < l[i]; ++k) // < l[i], not < len

{

if(num[dict[i][k]-'a']==0) break; // -'a'

}

if(k < l[i]) continue;

for(k = 0; k < len; ++k) h1[s[k]-'a']=0;

for(k = 0; k < l[i]; ++k) h1[dict[i][k]-'a']++;

for(k = 0; k < len; ++k)

if(num[s[k]-'a']<h1[s[k]-'a'])break;

v1 = sum_value(i);

if(k==len && l[i]<=len && v1 >= ma)

{

if(v1>ma) ma = v1, size = 0;

ans[size++][0]=dict[i];

// don't continue here

}

}

{

for(j = i; j < n; ++j)

if(l[j]+l[i]<=len)

{

for(k = 0; k < l[j]; ++k)

{

if(num[dict[j][k]-'a']==0) break;;

}

if(k < l[j]) continue;

for(k = 0; k < len; ++k) h2[s[k]-'a']=0;

for(k = 0; k < l[j]; ++k) h2[dict[j][k]-'a']++;

for(k = 0; k < len; ++k)

if(num[s[k]-'a']<h1[s[k]-'a']+h2[s[k]-'a'])

{

break;

}

v2 = sum_value(j);

if(k==len && v1+v2 >= ma)

{

if(v1+v2 > ma) ma = v1+v2, size=0;

ans[size][0]=dict[i];

ans[size++][1]=dict[j];

}

}

}

}

printf("%d/n", ma);

for(i = 0; i < size; ++i)

{

printf("%s", ans[i][0]);

if(ans[i][1]) printf(" %s", ans[i][1]);

puts("");

}

return 0;

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