文章

14

粉丝

230

获赞

112

访问

74.9k

头像
只区分空节点与非空结点 解决对称问题
P1551 东北大学机试题
发布于2022年8月7日 10:32
阅读数 5.5k

思路:

  1. 将非空结点的值修改成相同的值(如t),这样树的结点要么为#,要么为t;
  2. 逐层判断(1----2----4-----8)每层的字符数按照这样的规律提取子串,子串倒转之后,内容不变,即对称;

带注释代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. string str;
  6. cin>>str;
  7. int flag=0;
  8. int len = str.length();
  9. for(int i=0; i<len; i++) //将非空结点全部转换为t,只区分空节点和非空结点(注:这个方法借鉴学习了csYfZhang的题解)
  10. if(str[i]!='#')
  11. str[i]='t';
  12. int index=0,t=1;
  13. string temp1,temp2;
  14. while(index+t<=len)
  15. {
  16. temp1=str.substr(index,t);//提取该层的字符串
  17. temp2=temp1;
  18. reverse(temp1.begin(),temp1.end());//倒转比较
  19. if(temp1!=temp2) //不等,说明不对称
  20. {
  21. flag=1;
  22. break;
  23. }
  24. index+=t; //更新index t的值
  25. t=t*2;
  26. }
  27. if(flag==1) puts("NO");
  28. else puts("YES");
  29. }

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发