太简单了,本蒟蒻163行氢嵩搞定
#include<bits/stdc++.h>
using namespace std;
string a[10][10];
map<string,int> vis;
map<int,int> mp;
bool isvalid(int n)
{
vis.clear();
mp.clear();
for(int i=1;i<n;++i)
{
for(int j=1;j<n;++j)
{
vis[a[i][j]]++;
}
}
for(auto i:vis)
{
if(i.first=="+")continue;
int x=i.second;
string y=i.first;
if(x>=n)return 0;
mp[x]++;
}
for(auto i:mp)
{
int x=i.second;
int y=i.first;
if(y==n-1&&x!=1)return 0;
if(y!=n-1&&x!=2)return 0;
if(y>=n)return 0;
}
return 1;
}
int to_dec(string s,int n)
{
int ans=0;
for(char c:s)
{
ans=ans*n+c-'0';
}
return ans;
}
void getans(int n)
{
int ans[10]={0};
unordered_map<string,int> vis;
unordered_map<int,int> mp;
vis.clear();
mp.clear();
for(int i=1;i<n;++i)
{
for(int j=1;j<n;++j)
{
vis[a[i][j]]++;
}
}
for(auto i:vis)
{
if(i.first=="+")continue;
int x=i.second;
string y=i.first;
if(x>=n)return ;
mp[x]++;
}
for(auto i:mp)
{
int x=i.second;
int y=i.first;
if(y==n-1&&x!=1)return ;
if(y!=n-1&&x!=2)return ;
if(y>=n)return ;
}
int cur=0;
for(auto i:vis)
{
int x=i.second;
string y=i.first;
int x2=mp[x];
if(x2==1){
for(int i=1;i<n;++i)
{
if(a[0][i][0]==y[0])
{
ans[i]=n-2;
break;
}
}
continue;
}
else{
if(y.size()>1)continue;
for(int i=1;i<=n-2;++i)
{
if(x==i)
{
char c=y[0];
for(int j=1;j<n;++j)
{
if(a[0][j][0]==c)
{
ans[j]=i-1;
break;
}
}
break;
}
}
}
}
for(auto i:vis)
{
int x=i.second;
string y=i.first;
for(int i=1;i<n;++i)
{
for(int j=1;j<n;++j)
{
if(a[i][j]==y)
{
string t="";
for(char c:y)
{
for(int k=1;k<n;++k)
{
if(a[0][k][0]==c){t+=to_string(ans[k]);break;}
}
}
int x,y;
a[j][0];a[0][i];
if(ans[i]+ans[j]!=to_dec(t,n-1))
{
cout<<"ERROR!";
return ;
}
}
}
}
}
for(int i=1;i<n;++i)
{
cout<<a[0][i]<<'='<<ans[i]<<' ';
}
cout<<endl<<n-1;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
cin>>a[i][j];
}
}
if(!isvalid(n))
{
cout<<"ERROR!";return 0;
}
getans(n);
return 0;
}
大概O(n4)