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;
}
posted @ 2009-08-04 22:27  unber  阅读(994)  评论(0)    收藏  举报