代码等式

怎么感觉代码有点问题。。

1138 代码等式

时间限制:500MS  内存限制:65536K
提交次数:35 通过次数:11

题型: 编程题   语言: 无限制

描述

一个代码等式就是形如x1x2...xi=y1y2...yj,这里xi和yj是二进制的数字(0或1)或者是一个变量(如英语中的小写字母)。每一个变量都是一个有固定长度的二进制代码。例如: a,b,c,d,e是变且它们的长度分别是4,2,4,4,2。考虑等式:1bad1=acbe,这个等式共有16组解。现要求任给一个等式,计算一共有多少组解。 (变量最多26个,长度和不超过10000) 

输入格式

第一行数N为变量个数; 第二行N个数,为每个变量的位数 第三行为一个等式

输出格式

输出解的个数,无解输出0

输入样例

5
4 2 4 4 2
1bad1=acbe

输出样例

16



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int p[10010],k1[10010],k2[10010],mark[10010],flag;
char s1[10010],s2[10010];
int find(int x)
{
	return x==p[x]?x:p[x]=find(p[x]);
}
int main()
{
	int len[30],i,j,n,len1,len2,cnt[30],sum,ans,sum1,sum2,res[10010];
	scanf("%d",&n);
	cnt[0]=0;
	sum=0;
	for(i=0;i<n;i++)
	{
		scanf("%d",&len[i]);
		sum+=len[i];
		if(i)
			cnt[i]=cnt[i-1]+len[i-1];
	}
	for(i=0;i<10005;i++)
		p[i]=i;
	getchar();
	len1=len2=0;
	while((s1[len1++]=getchar())!='=');
	len1--;
	while((s2[len2++]=getchar())!='\n');
	len2--;
	for(i=0,sum1=0;i<len1;i++)
	{
		if(s1[i]>='a'&&s1[i]<='z')
			for(j=0;j<len[s1[i]-'a'];j++)
				k1[sum1++]=cnt[s1[i]-'a']+j+2;
		else
			k1[sum1++]=s1[i]-'0';
	}
	for(sum2=0,i=0;i<len2;i++)
	{
		if(s2[i]>='a'&&s2[i]<='z')
			for(j=0;j<len[s2[i]-'a'];j++)
				k2[sum2++]=cnt[s2[i]-'a']+j+2;
		else
			k2[sum2++]=s2[i]-'0';
	}
	if(sum1!=sum2)
	{
		if(sum1<sum2)
		{
			for(i=sum2-sum1;i<sum2;i++)
				k1[i]=k1[i-sum2+sum1];
			for(i=0;i<sum2-sum1;i++)
				k1[i]=0;
		}
		else
		{
			for(i=sum1-sum2;i<sum1;i++)
				k2[i]=k2[i-sum1+sum2];
			for(i=0;i<sum1-sum2;i++)
				k2[i]=0;
		}
	}
	int max;
	if(sum1>sum2)
		max=sum1;
	else
		max=sum2;
		ans=sum+2;
		for(i=0;i<max;i++)
		{
			int tx=find(k1[i]),ty=find(k2[i]);
			if(tx!=ty)
			{
				ans--;
				p[tx]=ty;
			}
		}
		if(find(1)==find(0))
			printf("0\n");
		else
		{
			memset(res,0,sizeof(res));
			res[0]=1;
			int len=1,c;
			ans-=2;
			for(i=0;i<ans;i++)
			{
				for(c=0,j=0;j<len;j++)
				{
					int s=(res[j]<<1)+c;
					c=s/10;
					res[j]=s%10;
				}
				if(c)
					res[len++]=1;
			}
			for(i=len-1;i>=0;i--)
				printf("%d",res[i]);
			printf("\n");
		}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值