数据结构好重要啊!
题意:
给n个长度相等的串,n是2的幂(是这样说么。。反正n就是2,4,8.。。。)
让n个串构成一个树,像族谱一样,求出可能的祖先,使得所有结点的两个孩子差异最小,
两个孩子有一个字符不同,cost就+1,求出最小的cost
思路:
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll __int64
using namespace std;
int ans,p[2060];
char c,s[1030][1030];
int main()
{
int i,j,n,l;
while(scanf("%d%d",&n,&l)&&(n||l))
{
for(i=0;i<n;i++)
scanf("%s",s[i]);
ans=0;
for(i=0;i<l;i++)
{
for(j=0;j<n;j++)
p[n+j]=1<<(s[j][i]-'A');
for(j=n-1;j>0;j--)
{
if(!(p[j+j]&p[j+j+1]))
{
ans++;
p[j]=(p[j+j]|p[j+j+1]);
}
else p[j]=(p[j+j]&p[j+j+1]);
}
c='A';
while(p[1]>>=1) c++;
putchar(c);
}
printf(" %d\n",ans);
}
return 0;
}