PKU1635 Subway tree systems 树的同构
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std;
const int MOD=9901;
const int MAX=3010;
const int MUL=9110;
vector<int>adj[MAX];
int father[MAX];
int hash[MAX];
bool cmp(int a,int b)
{
return hash[a]<hash[b];
}
int rebuild(char * str)
{
for(int i=0;i<MAX;++i)
adj[i].clear();
for(int i=0,j=1,k=0;str[i];++i)
{
if(str[i]=='0')
{
adj[k].push_back(j);
father[j]=k;
k=j;
++j;
}
else
k=father[k];
}
return 0;
}
int dfs(int k)
{
int val=0;
if(adj[k].size()==0)
val=1;
else
{
for(int i=0;i<adj[k].size();++i)
{
int j=adj[k][i];
hash[j]=dfs(j);
}
sort(adj[k].begin(),adj[k].end(),cmp);
val=1908;
for(int i=0;i<adj[k].size();++i)
{
int j=adj[k][i];
val=((val*MUL)^hash[j])%MOD;
}
}
return val;
}
int main()
{
int i,j,n;
char s[MAX];
scanf("%d",&n);
while(n--)
{
int hash1,hash2;
scanf("%s",s);
rebuild(s);
hash1=dfs(0);
scanf("%s",s);
rebuild(s);
hash2=dfs(0);
printf("%d %d\n",hash1,hash2);
printf("%s\n",hash1==hash2?"same":"different");
}
return 0;
}
#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std;
const int MOD=9901;
const int MAX=3010;
const int MUL=9110;
vector<int>adj[MAX];
int father[MAX];
int hash[MAX];
bool cmp(int a,int b)
{
return hash[a]<hash[b];
}
int rebuild(char * str)
{
for(int i=0;i<MAX;++i)
adj[i].clear();
for(int i=0,j=1,k=0;str[i];++i)
{
if(str[i]=='0')
{
adj[k].push_back(j);
father[j]=k;
k=j;
++j;
}
else
k=father[k];
}
return 0;
}
int dfs(int k)
{
int val=0;
if(adj[k].size()==0)
val=1;
else
{
for(int i=0;i<adj[k].size();++i)
{
int j=adj[k][i];
hash[j]=dfs(j);
}
sort(adj[k].begin(),adj[k].end(),cmp);
val=1908;
for(int i=0;i<adj[k].size();++i)
{
int j=adj[k][i];
val=((val*MUL)^hash[j])%MOD;
}
}
return val;
}
int main()
{
int i,j,n;
char s[MAX];
scanf("%d",&n);
while(n--)
{
int hash1,hash2;
scanf("%s",s);
rebuild(s);
hash1=dfs(0);
scanf("%s",s);
rebuild(s);
hash2=dfs(0);
printf("%d %d\n",hash1,hash2);
printf("%s\n",hash1==hash2?"same":"different");
}
return 0;
}