简单搜索题,几乎不需要优化,直接枚举一个或者两个单词,判断其组成字符的个数是否小于给定串对应的字符个数,满足则更新答案。搜索过程中如果需要单词里的字符不再给定串里,则提前跳出。
- /*
- 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[N][M], *ans[N][2];
- int len, n, size, l[N];
- 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[n]);
- if(dict[n][0]=='.')break;
- l[n] = strlen(dict[n]);
- ++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;
- }