1064 虫食算

2004年NOIP全国联赛提高组

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 查看运行结果
 
 
题目描述 Description

所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:

43#9865#045
    +    8468#6633
       44445506978

其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。

现在,我们对问题做两个限制:

首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。

其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。

BADC
      +    CBDA
            DCCC

上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,

输入描述 Input Description

输入包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

输出描述 Output Description

输出包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

样例输入 Sample Input

5
ABCED
BDACE
EBBAA

样例输出 Sample Output

1 0 3 4 2

数据范围及提示 Data Size & Hint

对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。

 
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<map> using namespace std;
int n,cnt;
map<char,int>m;
char ch[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char s1[],s2[],s3[];
int a[],b[],c[],d[]; bool check()
{
int tmp=;
for(int i=n-;i>=;i--)
{
c[i]=(m[s1[i]]+m[s2[i]]+tmp)%n;
tmp=(m[s1[i]]+m[s2[i]]+tmp);
tmp/=n;
if(c[i]!=m[s3[i]]) return false;
}
return true;
} int main()
{
scanf("%d",&n);
scanf("%s",s1);scanf("%s",s2);scanf("%s",s3);
for(int i=;i<n;i++) a[i]=i;
while(++cnt)
{
if(cnt>) break;
random_shuffle(a,a+n);
for(int i=;i<n;i++) m[ch[i]]=a[i];
if(check()) break;
} for(int i=;i<n;i++) printf("%d ",m[ch[i]]);
return ;
}

嗯...随机化30分

 
/*
嗯...倒着搜,一列一列的搜
边搜边剪枝。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib> #define N 27 using namespace std;
int n,m,ans,cnt,tmp;
char s1[N],s2[N],s3[N];
int match[N];
bool vis[N]; void dfs(int use,bool flag=false)
{
if(use==n)
{
if(!flag)
{
for(int i=;i<n;i++) printf("%d ",match[i]);
exit();
}
else return;
} for(int k=n--use;k>=;k--)
if(match[s1[k]]!=- && match[s2[k]]!=- && match[s3[k]]!=-
&& (match[s1[k]]+match[s2[k]])%n!=match[s3[k]]
&& (+match[s1[k]]+match[s2[k]])%n!=match[s3[k]]) return; int tmp=n--use;
if(match[s1[tmp]]==-)
{
for(int k=n-;k>=;k--)
{
if(!vis[k])
{
vis[k]=;match[s1[tmp]]=k;
dfs(use,flag);
vis[k]=;match[s1[tmp]]=-;
}
}
}
else if(match[s2[tmp]]==-)
{
for(int k=n-;k>=;k--)
{
if(!vis[k])
{
vis[k]=;match[s2[tmp]]=k;
dfs(use,flag);
vis[k]=;match[s2[tmp]]=-;
}
}
}
else if(match[s3[tmp]]==-)
{
int pre=match[s1[tmp]]+match[s2[tmp]]+flag;
for(int k=;k<n;k++)
if(match[k]==pre%n) return;
match[s3[tmp]]=pre%n;
vis[match[s3[tmp]]]=;
dfs(use+,pre>=n);
vis[match[s3[tmp]]]=;
match[s3[tmp]]=-;
}
else
{
int pre=match[s1[tmp]]+match[s2[tmp]]+flag;
if(match[s3[tmp]]==pre%n) dfs(use+,pre>=n);
} } int main()
{
scanf("%d%s%s%s",&n,s1,s2,s3);
for(int i=;i<n;i++)
{
match[i]=-;
s1[i]-='A';s2[i]-='A';s3[i]-='A';
}dfs();
return ;
}

虫食算 2004年NOIP全国联赛提高组(dfs)的更多相关文章

  1. Codevs 1064 虫食算 2004年NOIP全国联赛提高组

    1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...

  2. codevs 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description N位同学站成一排,音 ...

  3. 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...

  4. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  5. 津津的储蓄计划 2004年NOIP全国联赛提高组

    题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以 ...

  6. codevs 1057 津津的储蓄计划 2004年NOIP全国联赛提高组 x

     时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花 ...

  7. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  8. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  9. Codevs 3289 花匠 2013年NOIP全国联赛提高组

    3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...

随机推荐

  1. 1054.求平均数-PAT乙级真题

    从其他博客优秀代码中学到了些技巧,记录一下. 思路:使用sscanf和sprintf函数. sscanf() – 从一个字符串中读进与指定格式相符的数据 sprintf() – 字符串格式化命令,主要 ...

  2. [LNOI2014]LCA(树链剖分)

    BZOJ传送门 Luogu传送门 题目:给你一棵树,给你n个询问,每个询问要求输出$\sum_{i=l}^{r}depth(LCA(i,z))$ 细看看其实没有想象的那么难 大体思路: 1.对于每个询 ...

  3. Python随笔day03

    温故知新: 注释: 单行注释   # 多行注释   ‘’’ ‘’’  或者  “””  “”” 注意:三个单引号或双引号可以用于表示多行字符串. 判断输入的字符串是否是数字 salary = inpu ...

  4. codechef 营养题 第一弹

    第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...

  5. session 与 cookie 区别-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest

    cookie数据存放在客户的浏览器上,session数据放在服务器上. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session. sessi ...

  6. BNUOJ 2461 Anniversary party

    Anniversary party Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Origi ...

  7. URAL 1108 简单的树形dp背包问题

    题目大意: 一颗苹果树上,每条边都对应了一个权值,最后留下包括root : 1在的含有 m 条边的子树 , 希望留下的子树中权值之和最大 这里保留m条边,我们可以看作是保留了 m + 1 个点 令dp ...

  8. Prime Land(poj 1365)

    题意:这题题意难懂,看了题解才知道的.比如第二组sample,就是5^1*2^1=10, 求10-1即9的质因数分解,从大到小输出,即3^2.本来很简单的嘿,直接最快速幂+暴力最裸的就行了. #inc ...

  9. JRobin绘制指定时间段的流量图

    http://www.micmiu.com/enterprise-app/snmp/jrobin-graph-rpn/

  10. HUD——1286 找新朋友

    思路: 裸的欧拉函数 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...