zoukankan      html  css  js  c++  java
  • ContestHunter SRM 08 解题报告 Pascal

    http://contest-hunter.org:83/contest/SRM%2008

    A

    解法1:利用数据随机的特点,10位及以下的进行dfs判断,以上的直接输出Y。不过这也有反例,0111111111111111111111111111111111是N,但还是合理AC啦。

    var s:string;
    var i,j,a1,b,k,num,n:longint;
    var ss:array[0..10000] of string;
    var y,a:array[0..10000] of longint;
    var r:array[0..10000] of boolean;
    procedure dfs(d:longint);
    var i:longint;
    begin
      if d>n then
      begin
        inc(num);ss[num]:='';
        for i:=1 to n do ss[num]:=ss[num]+s[a[i]];y[num]:=1;
        for j:=1 to num-1 do if ss[num]=ss[j] then begin inc(y[j]);break;end;
        exit;
      end;
      for i:=a[d-1]+1 to length(s) do
        if not r[i] then
        begin
          r[i]:=true;a[d]:=i;
          dfs(d+1);
          r[i]:=false;
        end;
    end;
    begin
      readln(s);if length(s)>10 then begin writeln('Y');exit;end;
      for i:=1 to length(s) do if s[i]='1' then inc(a1) else inc(b);
      if (a1=2) or (b=2) then begin writeln('Y');exit;end;
      for n:=2 to length(s)-1 do
      begin
        num:=0;fillchar(y,sizeof(y),0);
        dfs(1);
        for i:=1 to num do if y[i]=2 then begin writeln('Y');exit;end;
      end;
      writeln('N');
      {for i:=2 to length(s)-1 do
      begin
        ss[1]:=s;;y[1]:=1;
        delete(ss[1],i+1,length(s)-i);
        for j:=2 to length(s)-i+1 do
        begin
          ss[j]:=ss[j-1];delete(ss[j],1,1);ss[j]:=ss[j]+s[j+i-1];
          y[j]:=1;
          for k:=1 to j-1 do
            if ss[j]=ss[k] then begin inc(y[k]);break;end;
        end;
        //for j:=1 to length(s) do writeln(ss[j]);
        for j:=1 to length(s)-i+1 do if y[j]=2 then begin writeln('Y');exit;end;
      end;
      writeln('N');   }
    end.
    

      解法2:第一种情况:0或1只出现2次的当然成立,直接输出Y。

    第二种情况:把字符串分割成三部分,如果成立以下条件:子集s1+00/11+子集s2,即输出Y。因为要找子序列,所以子集s1+0/1+子集s2必定只出现两次。例如101001,子集s1=101,子集s2=1,中间00,发现子序列10101出现两次。

    var s:ansistring;
    var i,a,b:longint;
    var c:char;
    begin
      readln(s);
      for i:=1 to length(s) do if s[i]='1' then inc(a) else inc(b);
      s:=''+s+'';c:='N';
      if (a=2) or (b=2) then c:='Y';
      for i:=2 to length(s)-1 do
        if (s[i]=s[i+1]) and (s[i-1]<>s[i]) and (s[i+1]<>s[i+2]) then begin c:='Y';break;end;
      writeln(c);
    end.
    

      【未完待续】

  • 相关阅读:
    例行更新,防止被踢
    C语言 遍历磁盘目录
    析构函数的调用
    数组学习笔记
    函数学习笔记
    c++语言 纯虚函数的使用
    c++语言 内联方法
    复制构造函数
    c++语言 覆盖成员函数
    面向对象程序设计
  • 原文地址:https://www.cnblogs.com/ligen1353055672/p/7248853.html
Copyright © 2011-2022 走看看