随笔-141  评论-9  文章-3  trackbacks-0

对ditch里边的单词进行枚举, 需要预处理, 过滤掉不符合题意的单词.

/*
ID: lorelei3
TASK: lgame
LANG: C++
*/


#include 
<fstream>
#include 
<string>
#include 
<memory.h>

using namespace std;

const int marks[] = {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};
const int MAX = 50000;

struct Word{
    
string word;
    
int mark;
    
int cnt[26];
}
;

ifstream fin1(
"lgame.in");
ifstream fin2(
"lgame.dict");
ofstream fout(
"lgame.out");

Word words[MAX];
int tot;

string ans[MAX];
int len;

string letters;
int letters_cnt[26];

int maxMark;

int getMark(string s){
    
int sum=0, len=s.length();
    
for(int i=0; i<len; ++i)
        sum 
+= marks[s[i]-'a'];
    
return sum;
}


void getCount(string s, int cnt[]){
    
int len = s.length();
    
for(int i=0; i<len; ++i)
        cnt[s[i]
-'a']++;
}


void mergeCount(int cnt1[], int cnt2[], int cnt[]){
    
for(int i=0; i<26++i)
        cnt[i] 
= cnt1[i]+cnt2[i];
}


bool checkCount(int cnt[]){
    
for(int i=0; i<26++i)
        
if(cnt[i]>letters_cnt[i])
            
return false;
    
return true;
}


void init(){

    
//init letter
    fin1>>letters;
    getCount(letters, letters_cnt);
    
//maxlength = letters.length();

    
//init ditch
    string word;
    
while(fin2>>word && word!="."){
    
        
int cnt[26];
        memset(cnt, 
0sizeof(cnt));
        getCount(word, cnt);
        
if(checkCount(cnt)){
            memcpy(words[tot].cnt, cnt, 
sizeof(int)*26);
            words[tot].word 
= word;
            words[tot].mark 
= getMark(word);
            tot
++;
        }
    
    }

}


void solve(){
    
    
for(int i=0; i<tot; ++i){
        
if(words[i].mark>maxMark){
            maxMark 
= words[i].mark;
            len
=0;
            ans[len] 
= words[i].word;
            len
++;
        }
else if(words[i].mark == maxMark){
            ans[len
++= words[i].word;
        }


        
for(int j=i+1; j<tot; ++j){

            
int cnt[26];
            memset(cnt, 
0sizeof(cnt));
            mergeCount(words[i].cnt, words[j].cnt, cnt);
            
if(!checkCount(cnt))
                
continue;
            
if(words[i].mark + words[j].mark > maxMark ){
                maxMark 
= words[i].mark + words[j].mark;
                len 
= 0;
                ans[len] 
= words[i].word+" "+words[j].word;
                len
++;
            }
else if(words[i].mark + words[j].mark == maxMark){
                ans[len
++= words[i].word+" "+words[j].word;
            }

        }

    }

}


void output(){
    fout
<<maxMark<<endl;
    
for(int i=0; i<len; ++i)
        fout
<<ans[i]<<endl;
}


int main(){

    init();

    solve();

    output();

    
return 0;
}
posted on 2011-01-30 11:23 小阮 阅读(193) 评论(0)  编辑 收藏 引用 所属分类: USACO

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理