1 条题解

  • 0
    @ 2021-6-14 23:29:34

    Pascal :

    program t2003_2;
    const maxm=20;maxp=100;
    var name:array[1..maxm]of string;
        says:array[1..maxp]of string;
        m,n,ntrue,nfalse,p,i,j,k,p1,count:integer;
        ss,nam,Zuifan,day,sub:string;
        all,find:boolean;
        g:array[1..maxm]of 0..2;
        f:array[1..2] of integer;
    
    function loc(s,sub:string;sta:integer):integer;
    var find:boolean;i,i1,j,Ls,Lsub:integer;
    begin
        find:=false;
        Ls:=length(s);Lsub:=length(sub);
        if sta+Lsub-1>Ls then
            loc:=0
        else begin
            i:=sta;
            while not find and (i<=Ls-Lsub+1) do begin
                j:=1;i1:=i;
                while (j<=Lsub) and (s[i1]=sub[j]) do
                  begin i1:=i1+1;j:=j+1;end;
                if j>Lsub then
                    find:=true
                else
                    i:=i+1;
            end;
            if find then
               loc:=i
            else
               loc:=0;
        end;
    end;
    
    function trim(s:string;sta,len:integer):string;
    var ss:string;i:integer;
    begin
        if len<1 then trim:=''
        else begin
           for i:=1 to len do
              ss[i]:=s[sta+i-1];
           ss[0]:=chr(len);
           trim:=ss;
        end;
    end;
    
    function isname(s:string):boolean;
    var  find:boolean;i:integer;
    begin
        find:=false;i:=1;
        while not find and (i<=m) do
            if name[i]=s then
                find:=true
            else
               i:=i+1;
        isname:=find;
    end;
    
    function isday(s:string):boolean;
    var ok:boolean;
    begin  ok:=true;
        if (s='Monday') or (s='Tuesday') or (s='Wednesday') or (s='Thursday') then
           ok:=true;
        if ok or (s='Friday') or (s='Saturday') or (s='Sunday') then
           isday:=true
        else
           isday:=false;
    end;
    
    function ok(s:string):boolean;
    var f:array[1..5]of integer;
        ok1:boolean;sub:string;
    begin
        f[1]:=loc(s,' ',1);
        sub:=trim(s,1,f[1]-2);
        if not isname(sub) then
            ok:=false
        else begin
            f[2]:=loc(s,' ',f[1]+1);
            sub:=trim(s,f[1]+1,f[2]-f[1]-1);
            if sub='I' then begin
                 f[3]:=loc(s,' ',f[2]+1);
                 sub:=trim(s,f[2]+1,f[3]-f[2]-1);
                 if not isname('I') and (sub<>'am') then ok:=false
                 else if isname('I') and (sub<>'is') and (sub<>'am') then ok:=false
                 else begin
                      f[4]:=loc(s,' ',f[3]+1);
                      if f[4]>=f[3]+1 then begin
                          sub:=trim(s,f[3]+1,f[4]-f[3]-1);
                          if sub<>'not' then ok:=false
                          else begin
                               f[5]:=loc(s,'.',f[4]+1);
                               if f[5]<length(s) then ok:=false
                               else begin
                                   sub:=trim(s,f[4]+1,f[5]-f[4]-1);
                                   if sub='guilty' then ok:=true
                                   else ok:=false;
                               end;
                          end;
                       end
                      else begin
                          f[4]:=loc(s,'.',f[3]+1);
                          if f[4]<length(s) then ok:=false
                          else begin
                               sub:=trim(s,f[3]+1,f[4]-f[3]-1);
                               if sub='guilty' then ok:=true
                               else ok:=false;
                          end;
                      end;
                 end;
              end
              else if sub='Today' then begin
                 f[3]:=loc(s,' ',f[2]+1);
                 sub:=trim(s,f[2]+1,f[3]-f[2]-1);
                 if sub<>'is' then ok:=false
                 else begin
                     f[4]:=loc(s,'.',f[3]+1);
                     if f[4]>=f[3]+1 then begin
                          sub:=trim(s,f[3]+1,f[4]-f[3]-1);
                          if isday(sub) then ok:=true
                          else ok:=false;
                       end
                     else ok:=false;
                 end;
              end
              else if isname(sub) then begin
                 f[3]:=loc(s,' ',f[2]+1);
                 sub:=trim(s,f[2]+1,f[3]-f[2]-1);
                 if sub<>'is' then ok:=false
                 else begin
                      f[4]:=loc(s,' ',f[3]+1);
                      if f[4]>=f[3]+1 then begin
                          sub:=trim(s,f[3]+1,f[4]-f[3]-1);
                          if sub<>'not' then ok:=false
                          else begin
                               f[5]:=loc(s,'.',f[4]+1);
                               if f[5]<length(s) then ok:=false
                               else begin
                                   sub:=trim(s,f[4]+1,f[5]-f[4]-1);
                                   if sub='guilty' then ok:=true
                                   else ok:=false;
                               end;
                          end;
                       end
                      else begin
                          f[4]:=loc(s,'.',f[3]+1);
                          if f[4]<length(s) then ok:=false
                          else begin
                               sub:=trim(s,f[3]+1,f[4]-f[3]-1);
                               if sub='guilty' then ok:=true
                               else ok:=false;
                          end;
                      end;
                 end;
               end
            else ok:=false;
    
        end;
    end;
    
    begin
            readln(m,n,p);
         for i:=1 to m do readln(name[i]);
         i:=1;j:=1;
         while i<=p do begin
            readln(ss);
            if ok(ss) then begin
                says[j]:=ss;j:=j+1;end;
            i:=i+1;
         end;
         p:=j-1;
         find:=false;
         for j:=1 to 7 do begin
             count:=0;
             case j of
               1:day:='Monday';
               2:day:='Tuesday';
               3:day:='Wednesday';
               4:day:='Thursday';
               5:day:='Friday';
               6:day:='Saturday';
               7:day:='Sunday';
             end;
             for i:=1 to m do begin
                 fillchar(g,sizeof(g),0);
                 all:=true;
                 p1:=1;
                 while all and (p1<=p) do begin
                     f[1]:=loc(says[p1],' ',1);
                     f[2]:=loc(says[p1],' ',f[1]+1);
                     nam:=trim(says[p1],1,f[1]-2);
                     for k:=1 to m do
                        if name[k]=nam then break;
                     sub:=trim(says[p1],f[1]+1,f[2]-f[1]-1);
                     if sub='Today' then begin
                          if g[k]=0 then begin
                             if trim(says[p1],f[2]+4,length(says[p1])-f[2]-4)=day then
                                g[k]:=2
                             else g[k]:=1;
                            end
                          else if (g[k]=1) and (trim(says[p1],f[2]+4,length(says[p1])-f[2]-4)=day) then
                                all:=false
                          else if (g[k]=2) and (trim(says[p1],f[2]+4,length(says[p1])-f[2]-4)<>day) then
                                all:=false;
                       end
                     else if (sub='I')  and (trim(says[p1],f[2]+1,2)='am') then begin
                          if g[k]=0 then begin
                                if trim(says[p1],f[2]+4,1)='g' then begin
                                    if nam=name[i] then g[k]:=2
                                      else g[k]:=1;
                                  end
                                else begin
                                    if nam=name[i] then g[k]:=1
                                      else g[k]:=2;
                                  end;
                            end
                          else if (g[k]=1) then begin
                                if (trim(says[p1],f[2]+4,1)='g') and (nam=name[i]) then
                                       all:=false
                                else if (trim(says[p1],f[2]+4,1)='n') and (nam<>name[i]) then
                                       all:=false;
                            end
                          else if (g[k]=2) then begin
                                if (trim(says[p1],f[2]+4,1)='g') and (nam<>name[i]) then
                                       all:=false
                                else if (trim(says[p1],f[2]+4,1)='n') and (nam=name[i]) then
                                       all:=false;
                            end;
                       end
                     else begin
                          if g[k]=0 then begin
                                if trim(says[p1],f[2]+4,1)='g' then begin
                                    if sub=name[i] then g[k]:=2
                                       else g[k]:=1;
                                   end
                                else begin
                                    if sub=name[i] then g[k]:=1
                                       else g[k]:=2;
                                   end;
                            end
                          else if (g[k]=1) then begin
                                if (trim(says[p1],f[2]+4,1)='g') and (sub=name[i]) then
                                       all:=false
                                else if (trim(says[p1],f[2]+4,1)='n') and (sub<>name[i]) then
                                       all:=false;
                            end
                          else if (g[k]=2) then begin
                                if (trim(says[p1],f[2]+4,1)='g') and (sub<>name[i]) then
                                       all:=false
                                else if (trim(says[p1],f[2]+4,1)='n') and (sub=name[i]) then
                                       all:=false;
                            end;
                       end;
                       p1:=p1+1;
                 end;
                 if all then begin
                     ntrue:=0;
                     nfalse:=0;
                     for p1:=1 to m do
                        if g[p1]=1 then nfalse:=nfalse+1
                        else if g[p1]=2 then ntrue:=ntrue+1;
                     if (nfalse<=n) and (ntrue<=m-n) then begin
                        count:=count+1;
                        ZuiFan:=name[i];
                        find:=true;
                     end;
                 end;
             end;
             if count=1 then begin
                 writeln(ZuiFan);close(output);halt;end;
         end;
         if find then writeln('Cannot Determine')
         else  writeln('Impossible');
    
    end.
    
    • 1

    信息

    ID
    227
    时间
    1000ms
    内存
    125MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者