P10477 题解

打印 上一主题 下一主题

主题 1107|帖子 1107|积分 3321

题目传送门

题目传送门(洛谷)
Step1 理解题意



  • 一共有                                         T                                  T                     T 组数据
  • 有一个地铁,有一个中央车站(即为),有一个人从中央车站出发。
  • 对于每组数据,给定两个同样长度的01串                                                    s                               1                                            s_1                     s1​ ,                                                    s                               2                                            s_2                     s2​(即为他的遍历路线)
  • 对于每个字符串,                                        0                                  0                     0 代表离中央车站远一格,                                        1                                  1                     1 代表离中央车站近一格。
  • 问                                                    s                               1                                            s_1                     s1​ 与                                                    s                               2                                            s_2                     s2​ 所代表的遍历路线所形成的地铁是否一致

Step 2 样例解释

如上图,在第一个样例                                    0010011101001011                              0010011101001011                  0010011101001011 和                                    0100011011001011                              0100011011001011                  0100011011001011 中:


  • 将                                              0                                      0                        0 当作                                              1                                      1                        1 ,                                              1                                      1                        1 当作                                              −                               1                                      -1                        −1
  • 如果有一段子序列的和为                                              0                                      0                        0,则阐明又回到了根节点
  • 比如                                              0010011101001011                                      0010011101001011                        0010011101001011 中,                                             00100111                                      00100111                        00100111、                                             01                                      01                        01、                                             001011                                      001011                        001011的和均为                                              0                                      0                        0 效果为 4,1,3
  • 同理,在                                              0100011011001011                                      0100011011001011                        0100011011001011 中                                              01                                      01                        01 、                                              00011011                                      00011011                        00011011 、                                              001011                                      001011                        001011 的效果为                                              0                                      0                        0 效果为 1,4,3
  • 可见                                              0010011101001011                                      0010011101001011                        0010011101001011 和                                              0100011011001011                                      0100011011001011                        0100011011001011 的效果为                                              s                               a                               m                               e                                      same                        same
  • (ps:在截成的小段递归求解时,要把开头和结尾的 0 和 1去掉,才算是以这个子树的根为起点)
Step 3 思路解释

先输入字符串                                              s                            1                                       s_1                  s1​,                                              s                            2                                       s_2                  s2​,然后去探求和为                                    0                              0                  0 的子串,然后将每一小块递归处理后,加入一个数组。扫描完成后,将数组排序,拼接,即最小表示。


  • (ps:刚开始的时候要加上首位的 0、1,由于我们的递归是从进入一棵树开始的。)
Step 4 Ac code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string s1,s2;
  4. void fin(string &s){
  5.         if(s=="01") return;
  6.         s=s.substr(1,s.size()-2);
  7.         int st=0,cnt=0;
  8.         vector<string>pass;
  9.         //pass.clear();
  10.         for(int i=0;i<s.size();i++){
  11.                 cnt+=(s[i]=='0'?1:-1);
  12.                 if(!cnt){
  13.                         string ss=s.substr(st,i-st+1);
  14.                         fin(ss);
  15.                         pass.push_back(ss);
  16.                         st=i+1;
  17.                 }
  18.         }
  19.         sort(pass.begin(),pass.end());
  20.         s='0';
  21.         for(int j=0;j<pass.size();j++) s+=pass[j];
  22.         s+='1';
  23.         return;
  24. }
  25. int main(){
  26.         int t;
  27.         scanf("%d",&t);
  28.         while(t--){
  29.                 cin>>s1>>s2;
  30.                 s1='0'+s1+'1',s2='0'+s2+'1';
  31.                 fin(s1);fin(s2);
  32.                 if(s1==s2) printf("same\n");
  33.                 else printf("different\n");
  34.         }
  35.         return 0;
  36. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表