CH Round #16
Prefix 35/105 |
From lydrainbowcat |
Channel 4/87 |
From lydrainbowcat |
Parade 7/78 |
From lydrainbowcat |
当时在看数论,没参加比赛(蒟蒻怕掉Rating我会说?)
简单看了一下题,难度似乎不是很大,都有一定思路,举办方已经给了题解,不过我还是说说自己的想法吧,也就是昨天的第一眼感受。
Prefix:前缀很容易就想起来Trie,一上来就数据结构?这么凶残?不过Trie码起来也很快的,一边码完,测了下样例就交了。==可耻的85了……改了一下A了,貌似将近花了30分钟……想当年ACM,就挂在Trie上了,绝对AC的算法,可惜当时Trie很不熟。不过为了不体现凶残性,qsort应该也是可以做的,字典序,然后每个串与前后两个串(必定相似性最高)对比枚举一下就出来了。
Channel:貌似很厉害的T。反正一看到这种东西就容易想到树状数组、线段树之类的,不过貌似不太可行,目测下写爆搜。
Parade:把相邻的数字作差,转换成大、小写字母,然后上KMP。其实我也不知道这个可不可行。目测官解也是KMP,不过估计思路不一样吧。
1 program ta; 2 type 3 trie=^link; 4 link=record 5 c:integer; 6 t:array ['a'..'z'] of trie; 7 end; 8 var 9 n,ls,i:integer; 10 z:char; 11 head:trie; 12 s:array [1..1000] of ansistring; 13 procedure fill(q:trie); 14 begin 15 for z:='a' to 'z' do q^.t[z]:=nil; 16 end; 17 procedure build(q:trie;x:integer); 18 begin 19 inc(q^.c); 20 if x>ls then exit; 21 if q^.t[s[i][x]]=nil then begin 22 new(q^.t[s[i][x]]);fill(q^.t[s[i][x]]);q^.t[s[i][x]]^.c:=0; 23 end; 24 build(q^.t[s[i][x]],x+1); 25 end; 26 function ask(q:trie;x:integer):integer; 27 begin 28 if q^.c=1 then exit(x-1); 29 if x>ls then exit; 30 exit(ask(q^.t[s[i][x]],x+1)); 31 end; 32 begin 33 readln(n); 34 new(head);fill(head);head^.c:=1; 35 for i:=1 to n do begin 36 readln(s[i]);ls:=length(s[i]); 37 build(head,1); 38 end; 39 for i:=1 to n do begin 40 ls:=length(s[i]); 41 writeln(copy(s[i],1,ask(head,1))); 42 end; 43 end.