题意:题意:给你3个字符串s1,s2,s3;要求对三个字符串中的字符赋值(同样的字符串进行同样的数字替换),
替换后的三个数进行四则运算要满足左边等于右边。求有几种解法。
Sample Input
2
A A A
BCD BCD B
Sample Output
5
72
eg:ABBDE ABCCC BDBDE ;令 A = 1, B = 2, C = 0, D = 4, E = 5
12245 + 12000 = 24245;
注意没有前导零!
!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<queue>
#include<map>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int kind = 26;
const int maxn = 250*1000; //注意RE,单词长度*单词个数
const int M = 5100000;
int vis[10],flag[10],l,ans;
char s1[10],s2[10],s3[10],s[10];
map<char,int>mp,dl;
void Cal()
{
int a=0,b=0,c=0;
for(int i=0;i<strlen(s1);i++)
a=a*10+mp[s1[i]];
for(int i=0;i<strlen(s2);i++)
b=b*10+mp[s2[i]];
for(int i=0;i<strlen(s3);i++)
c=c*10+mp[s3[i]];
if(a+b==c) ans++;
if(a-b==c) ans++;
if(a*b==c) ans++;
if(b&&a==b*c) ans++;
}
void dfs(int num)
{
if(num>=l)
{
Cal();
return;
}
for(int i=0;i<10;i++)
{
if(i==0&&dl[s[num]]) continue;
if(!flag[i])
{
flag[i]=1;
mp[s[num]]=i;
dfs(num+1);
flag[i]=0;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
mp.clear();dl.clear();
ans=0;
scanf("%s%s%s",s1,s2,s3);
if(strlen(s1)>1) dl[s1[0]]=1;
if(strlen(s2)>1) dl[s2[0]]=1;
if(strlen(s3)>1) dl[s3[0]]=1;
int i,k,j;
l=0;
for(i=0;i<strlen(s1);i++)
{
if(vis[s1[i]-'A']) continue;
vis[s1[i]-'A']++;
s[l++]=s1[i];
}
for(i=0;i<strlen(s2);i++)
{
if(vis[s2[i]-'A']) continue;
vis[s2[i]-'A']++;
s[l++]=s2[i];
}
for(i=0;i<strlen(s3);i++)
{
if(vis[s3[i]-'A']) continue;
vis[s3[i]-'A']++;
s[l++]=s3[i];
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
/*
2
A A A
BCD BCD B
*/