怎么感觉代码有点问题。。
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;
}