ex.dpr

来自「tongji acm-online judge solution」· DPR 代码 · 共 107 行

DPR
107
字号
program Ural_1287(Input, Output);
//19:50
const
    MaxN = 1400;
type
    TIndex = Longint;
    TStatistic = record
        Row, Column, UpDiagonal, {i - j = 0} DownDiagonal {i + j = 0}: TIndex;
    end;
    TData = array[0..MaxN + 1] of record
        Value: Char;
        Coarse, Small: TStatistic;
    end;
var
    MaxCoarseLen, MaxSmallLen, N: TIndex;
    Last, Current: TData;

procedure Main;
var
    i, j: TIndex;
    Ch: Char;

begin
    MaxCoarseLen := 0;
    MaxSmallLen := 0;
    Readln(N);
    FillChar(Last, SizeOf(Last), 0);
    FillChar(Current, SizeOf(Current), 0);
    //    Last[0].Value := #0;
    //Current[0].Value := #0;
    //Current[N + 1].Value := #0;
    for i := 1 to N do
    begin
        for j := 1 to N do
        begin
            repeat
                Read(Ch);
            until Ch in ['S', 's'];
            Current[j].Value := Ch;
            if Current[j].Value = 'S' then
            begin
                Current[j].Coarse.Row := Ord(Current[j - 1].Value = Current[j].Value) * Current[j - 1].Coarse.Row + 1;
                Current[j].Coarse.Column := Ord(Last[j].Value = Current[j].Value) * Last[j].Coarse.Column + 1;
                Current[j].Coarse.UpDiagonal := Ord(Last[j + 1].Value = Current[j].Value) * Last[j + 1].Coarse.UpDiagonal + 1;
                Current[j].Coarse.DownDiagonal := Ord(Last[j - 1].Value = Current[j].Value) * Last[j - 1].Coarse.DownDiagonal + 1;
                Current[j].Small.Row := 0;
                Current[j].Small.Column := 0;
                Current[j].Small.UpDiagonal := 0;
                Current[j].Small.DownDiagonal := 0;
            end
            else
            begin
                Current[j].Coarse.Row := 0;
                Current[j].Coarse.Column := 0;
                Current[j].Coarse.UpDiagonal := 0;
                Current[j].Coarse.DownDiagonal := 0;
                Current[j].Small.Row := Ord(Current[j - 1].Value = Current[j].Value) * Current[j - 1].Small.Row + 1;
                Current[j].Small.Column := Ord(Last[j].Value = Current[j].Value) * Last[j].Small.Column + 1;
                Current[j].Small.UpDiagonal := Ord(Last[j + 1].Value = Current[j].Value) * Last[j + 1].Small.UpDiagonal + 1;
                Current[j].Small.DownDiagonal := Ord(Last[j - 1].Value = Current[j].Value) * Last[j - 1].Small.DownDiagonal + 1;
            end;
            if Current[j].Coarse.Row > MaxCoarseLen then
                MaxCoarseLen := Current[j].Coarse.Row;
            if Current[j].Coarse.Column > MaxCoarseLen then
                MaxCoarseLen := Current[j].Coarse.Column;
            if Current[j].Coarse.UpDiagonal > MaxCoarseLen then
                MaxCoarseLen := Current[j].Coarse.UpDiagonal;
            if Current[j].Coarse.DownDiagonal > MaxCoarseLen then
                MaxCoarseLen := Current[j].Coarse.DownDiagonal;
            if Current[j].Small.Row > MaxSmallLen then
                MaxSmallLen := Current[j].Small.Row;
            if Current[j].Small.Column > MaxSmallLen then
                MaxSmallLen := Current[j].Small.Column;
            if Current[j].Small.UpDiagonal > MaxSmallLen then
                MaxSmallLen := Current[j].Small.UpDiagonal;
            if Current[j].Small.DownDiagonal > MaxSmallLen then
                MaxSmallLen := Current[j].Small.DownDiagonal;
        end;
        Last := Current;
    end;
    if MaxCoarseLen > MaxSmallLen then
    begin
        Writeln('S');
        Writeln(MaxCoarseLen);
    end
    else if MaxCoarseLen < MaxSmallLen then
    begin
        Writeln('s');
        Writeln(MaxSmallLen);
    end
    else if MaxCoarseLen = MaxSmallLen then
    begin
        Writeln('?');
        Writeln(MaxCoarseLen);
    end;
end;
begin
{    Assign(Input, 'i.txt');
    Reset(Input);
    Assign(Output, 'o.txt');
    Rewrite(Output);}
    Main;
{    Close(Input);
    Close(Output);}
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?