zoukankan      html  css  js  c++  java
  • Gym

    Gym - 101981E Eva and Euro coins

    题意:给你两个长度皆为n的01串s和t,能做的操作是把连续k个相同的字符反转过来,问s串能不能变成t串。

    一开始把相同的漏看了,便以为是个差分模拟,然后懂了题意后一时也没想到,看了题解瞬间明了(题解做题法)。

    相同连续k个1可以变成0,而相同连续k个0可以变成1,然后调整1的位置,所以其实便是看把连续k个相同字符删去后,两个字符串还相不相同,直接栈模拟。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<stack>
     4 using namespace std;
     5 const int N=1e6+11; 
     6 struct Node{
     7     int op,num;
     8     Node(){}
     9     Node(int op,int num):op(op),num(num){}
    10     bool operator!=(const Node& n1)const{
    11         return op!=n1.op||num!=n1.num;
    12     }
    13 };
    14 int n,k;
    15 char a[N],b[N];
    16 stack<Node> ss,tt;
    17 void solve(char* s,stack<Node>& sta){
    18     while(!sta.empty()) sta.pop();
    19     for(int i=0;i<n;i++){
    20         if(sta.empty()||sta.top().op!=s[i]-'0')
    21             sta.push(Node(s[i]-'0',1));
    22         else sta.top().num++;
    23         if(sta.top().num==k) sta.pop();
    24     }
    25 }
    26 int main(){
    27     while(~scanf("%d%d",&n,&k)){
    28         scanf("%s%s",a,b);
    29         solve(a,ss);
    30         solve(b,tt);
    31         bool flag=true;
    32         if(ss.size()!=tt.size()) flag=false;
    33         while(flag&&!ss.empty()&&!tt.empty()){
    34             if(ss.top()!=tt.top()) flag=false;
    35             ss.pop();
    36             tt.pop();
    37         }
    38         if(flag) printf("Yes
    ");
    39         else printf("No
    ");
    40     }
    41     return 0;
    42 }
    tcl
  • 相关阅读:
    C++小知识之Vector用法
    云计算和大数据入门
    C++解析JSON之JsonCPP
    OSS研究
    linux内核--进程地址空间(三)
    学习笔记:修改网吧计费系统
    学习笔记:找回电脑开机密码
    例说C#深拷贝与浅拷贝
    JBossESB教程(一)——开发环境的搭建
    Java集合---ConcurrentHashMap原理分析
  • 原文地址:https://www.cnblogs.com/LMCC1108/p/11714782.html
Copyright © 2011-2022 走看看