题目大意:
用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树
我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序,来判断这个hash字符串是否相同
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <string> 5 #include <algorithm> 6 #include <vector> 7 using namespace std; 8 #define N 3010 9 char s1[N] , s2[N]; 10 11 string dfs(int l , int r , char *s) 12 { 13 // cout<<l<<" "<<r<<endl; 14 vector<string> v; 15 int num = 0; 16 string ret = ""; 17 for(int i=l ; i<=r ; i++){ 18 if(s[i] == ‘0‘) num++; 19 else num--; 20 if(num==0){ 21 string tmp = "0"+dfs(l+1 , i-1 , s)+"1"; 22 v.push_back(tmp); 23 l = i+1; 24 } 25 } 26 sort(v.begin() , v.end()); 27 for(int i=0 ; i<v.size() ; i++) 28 ret += v[i]; 29 return ret; 30 } 31 32 int main() 33 { 34 #ifndef ONLINE_JUDGE 35 freopen("a.in" , "r" , stdin); 36 #endif // ONLINE_JUDGE 37 int T; 38 scanf("%d" , &T); 39 while(T--){ 40 scanf("%s%s" , s1 , s2); 41 string t1 = dfs(0 , strlen(s1)-1 , s1); 42 string t2 = dfs(0 , strlen(s2)-1 , s2); 43 // cout<<t1<<" "<<t2<<endl; 44 printf("%s\n" , (t1==t2)?"same":"different"); 45 } 46 return 0; 47 }
时间: 2024-09-28 14:27:49