問題の説明
ルースの有名な科学者は、二元系の学生の理解を確認するために、彼は表の以下の追加は、手紙は表の数値を表しています。例えば:
LKVE
LLKVE
KKVE KL
VVE KL KK
EE KL KK KV
その意味は次のとおりです。
L + L = L、L + K = K、L + V = V、L + E = E
K + L = K、K + K = V、K + V = E、K + E = KL
...... E + E = KV
これらのルールを導出することができる:L = 0、K = 1、V = 2、E = 3は、テーブルは、2進加算器4を表し、同時に決定してもよいです
入力形式
N(n≤9)行の数を表します。
次のn行、N列を構成する各列、スペースで区切られた各文字列。(唯一の「+」記号の文字列は、大文字です)
出力フォーマット
アルファベット分析によって......、L = 0、K = 1:①何各文字は、次のようなフォーマットの数を表します。
②少数小数を追加します。
③表が加算組成べきで出力できない場合は、「ERROR!」
サンプル入力
5
LKVE
LLKVE
KKVE KL
VVE KL KK
EE KL KK KV
サンプル出力
L = 0、K = 1 V = 2 E = 3
4
解決
あなたはこの質問を見たとき、検索のない考えはありませんか?パスコードは、前に......そしてあります。
しかし、検索は実際にそれを使うのか?
私たちは見ることができます。n進数の場合は\(私は\)場合、\(私は\)に加えて、いくつかの数の\(J \)は二桁になり、あなたは次の不等式を得ることができます:
\ [Iは、N-> Jを+ 1 \ RIGHTARROW J> N-1
-i \] を満たす要件\(J \)と数\(N-1-(N- 1-I)= iは\) 。このことから我々は、値が2桁の数字の文字列に対応する文字であると結論付けることができます。私たちは、正しい検証で行う必要があります。それでは、どのようにそれを確認するのですか?最も直接的な方法は、直接の世代を満たすことであるが、それには各文字の値を計算する別の方法を使用することができますか?
より困難にします。数値の場合は\(私は\) 、あなたがしたい場合は(J + K \)を\の桁目\(私は\) 、満たさなければならない\を(私はK <N-を\ <) 。条件満たす、次に、仮定\(K \)有している\([I] \) A、\(I \)値である\(1-Nを- [I] \) 。\([I] \)二桁ビットに対する文字の出現数のみを要求します。
数が同じ行に二回表示される場合はまた、明らかにそれは直接最後に、右ではありません。
行の数であるので、次のコードで(\ N-)\ので、彼らは実際には\(N-1 \)バイナリ添加。
コード
#include <iostream>
#include <cstdio>
#include <string>
#define N 10
using namespace std;
int n,i,j,a[N],num[30];
char l[N];
int main()
{
cin>>n;
for(i=0;i<n;i++){
char c;
cin>>c;
if(c!='+') l[i]=c;
}
for(i=2;i<=n;i++){
string s1,s;
for(j=1;j<=n;j++){
cin>>s;
if(j==1) continue;
if(j!=2&&s==s1){
cout<<"ERROR!"<<endl;
return 0;
}
s1=s;
if(i!=1&&j!=-1){
int l=s.length();
if(l==2){
a[i-1]++;
num[(int)s[l-1]]++;
}
}
}
}
for(i=1;i<n;i++){
if(a[i]!=n-2-num[(int)l[i]]){
cout<<"ERROR!"<<endl;
return 0;
}
}
for(i=1;i<n;i++){
cout<<l[i]<<"="<<a[i]<<' ';
}
cout<<endl<<n-1<<endl;
return 0;
}