转自: https://www.cnblogs.com/liaoguifa/archive/2013/06/30/3163971.html
个人觉得这博主写的题解贼好, 但代码好像有bug, 你们可以去测试一下以下数据:
1
1
1=0
以上测试用例, 该博主输出为1, 但正确结果为0;
以下是我根据该博主的思路重新修改了bug的代码并提交oj过了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<queue>
#include<ctime>
#define LL long long
using namespace std;
typedef struct Node{
int value;
int letter;
int column;
}node;
node lef[5005],righ[5005];
int ll=0,rr=0;
void tranvalue(int cur, int kind, int value){
if(kind==1 && righ[cur].value==-1){
for(int i=0;i<ll;i++){
if(righ[i].letter==righ[cur].letter&&righ[i].column==righ[cur].column&&righ[i].value==-1){
righ[i].value=value;
tranvalue(i,0,value);
}
if(lef[i].letter==righ[cur].letter&&lef[i].column==righ[cur].column&&lef[i].value==-1){
tranvalue(i,0,value);
}
}
}
if(kind==0&&lef[cur].value==-1){
for(int i=0;i<ll;i++){
if(lef[i].letter==lef[cur].letter && lef[i].column==lef[cur].column&&lef[i].value==-1){
lef[i].value=1;
tranvalue(i,1,value);
}
if(righ[i].letter==lef[cur].letter&&righ[i].column==lef[cur].column&&righ[i].value==-1){
tranvalue(i,1,value);
}
}
}
}
int main(){
int n;
cin>>n;
int abc[27];
for(int i=0;i<n;i++)
cin>>abc[i];
char input[10005];
cin>>input;
int len=strlen(input);
int flag=strchr(input, '=')-input;
for(int i=0;i<flag;i++){
if(input[i]=='0'||input[i]=='1'){
lef[ll].value=input[i]-'0';
lef[ll].letter=-1;
lef[ll++].column=-1;
}
else{
int k=input[i]-'a';
for(int j=0;j<abc[k];j++){
lef[ll].value=-1;
lef[ll].letter=k;
lef[ll++].column=j;
}
}
}
for(int i=flag+1;i<len;i++){
if(input[i]=='0'||input[i]=='1'){
righ[rr].value=input[i]-'0';
righ[rr].letter=-1;
righ[rr++].column=-1;
}
else{
int k=input[i]-'a';
for(int j=0;j<abc[k];j++){
righ[rr].value=-1;
righ[rr].letter=k;
righ[rr++].column=j;
}
}
}
if(ll!=rr){
cout<<0<<endl;
return 0;
}
for(int i=0;i<ll;i++){
if(lef[i].letter==lef[i].column&&lef[i].letter==-1){
tranvalue(i,1,lef[i].value);
}
if(righ[i].letter==righ[i].column&&righ[i].letter==-1){
tranvalue(i,0,righ[i].value);
}
}
int ans=1;
for(int i=0;i<ll;i++){
if(lef[i].value==-1){
ans*=2;
tranvalue(i,1,1);
}
}
for(int i=0;i<ll;i++){
if(lef[i].value!=righ[i].value){
cout<<0<<endl;
return 0;
}
}
cout<<ans<<endl;
return 0;
}