lgame.cpp
来自「dd牛的usaco源代码!对学习算法」· C++ 代码 · 共 101 行
CPP
101 行
/*
ID: dd.ener1
PROG: lgame
LANG: C++
*/
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int scores[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};
string ss[10000];
int sc[10000];
string S;
int N;
int ch[26];
string res[1000];
int R;
int max1;
bool valid(const string& s){
static int ch2[26];
for(int i=0;i<26;++i)
ch2[i]=0;
for(int i=s.size()-1;i>=0;--i)
ch2[s[i]-'a']++;
for(int i=0;i<26;++i)
if(ch2[i]>ch[i])return false;
return true;
}
bool valid(const string& s1,const string& s2){
static int ch2[26];
for(int i=0;i<26;++i)
ch2[i]=0;
for(int i=s1.size()-1;i>=0;--i)
ch2[s1[i]-'a']++;
for(int i=s2.size()-1;i>=0;--i)
ch2[s2[i]-'a']++;
for(int i=0;i<26;++i)
if(ch2[i]>ch[i])return false;
return true;
}
int score(const string& s){
int res=0;
for(int i=s.size()-1;i>=0;--i)
res+=scores[s[i]-'a'];
return res;
}
inline void add_res(const string& s){
res[R++]=s;
}
inline void re_res(const string& s){
res[0]=s;
R=1;
}
inline string link(const string& s1,const string& s2){
if(s1<s2)return s1+' '+s2;
else return s2+' '+s1;
}
int main(){
freopen("lgame.in","r",stdin);
getline(cin,S);
for(int i=S.size()-1;i>=0;--i)
ch[S[i]-'a']++;
freopen("lgame.dict","r",stdin);
N=0;
for(;;){
string s;
getline(cin,s);
if(s==".")break;
if(valid(s)){
ss[N]=s;
int sco=score(s);
sc[N++]=sco;
if(sco>=max1)max1=sco;
}
}
for(int i=0;i<N;++i){
if(sc[i]==max1)
add_res(ss[i]);
}
for(int i=N-1;i>=0;--i)
for(int j=0;j<i;++j){
if(sc[i]+sc[j]<max1)continue;
if(valid(ss[i],ss[j]))
if(sc[i]+sc[j]>max1){
max1=sc[i]+sc[j];
re_res(link(ss[i],ss[j]));
}
else if(sc[i]+sc[j]==max1)
add_res(link(ss[i],ss[j]));
}
sort(res,res+R);
freopen("lgame.out","w",stdout);
cout<<max1<<endl;
for(int i=0;i<R;++i)
cout<<res[i]<<endl;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?