A 山坡探险
画图做吧,考差分的。注意到如果存在合法的山坡,一定是恰好走了hn-h0,然后其他的都抵消了。

Codeuses math;
var m,n,hi,hn,t,count:longint;
ch:char;
begin
readln(n,hi,hn);
while not eoln do begin
read(ch);inc(m);
case ch of
'U':t:=1;
'D':t:=-1;
end;
inc(hi,t);
while hi<0 do begin
inc(count);
inc(hi);
end;
end;
if(count>n-m)or
(abs(hn-hi)+count>n-m)or
((((n-m)-abs(hn-hi)-count)and 1)=1)
then writeln('T_T')
else writeln('lala');
end.
//==========
uses math;
var temp,d,m,n,h0,hn,sum,t,lowest:longint;
ch:char;
begin
readln(n,h0,hn);
d:=hn-h0;sum:=0;lowest:=2;
while not eoln do begin
read(ch);inc(m);
case ch of
'U':t:=1;
'D':t:=-1;
end;
inc(sum,t);
lowest:=min(lowest,sum);
end;
t:=d-sum;temp:=(n-m-abs(t))>>1;
if(abs(t)>(n-m))or
(((n-m-abs(t))and 1)=1)or
((h0+lowest<0)and(t<=0)and(h0+lowest+temp<0))or
((h0+lowest<0)and(t>=0)and(h0+lowest+temp+t<0))
then writeln('T_T')
else writeln('lala');
end.
B 外星人
beautifulword(T1)及其逆串(T2)是模版串,分别跟主串S1及其逆串S2做KMP得到L,R数组,L[i]代表最长的S1[1..i]的后缀跟T1前缀相等的长度,R同理。存在L[i]+R[j]>=length(s) (i<j)就能看见。

Codeprogram C9B;
uses math;
const Filename='C9B';maxn=10000;
type Tarray=array[1..maxn] of integer;
var T1,T2,S1,S2:ansistring;
temp,L,R,prefix:Tarray;
v,i,n,m,ans:integer;
procedure OpenFile;
begin
Assign(Input,Filename+'.in');
Assign(Output,Filename+'.out');
Reset(Input);Rewrite(Output);
end;
procedure CloseFile;
begin close(input);close(Output);end;
procedure KMP(var s,t:ansistring;var fix:Tarray);
var k,i:integer;
begin
k:=0;Prefix[1]:=0;
for i:=2 to m do begin
while(k>0)and(T[k+1]<>T[i])do k:=Prefix[k];
if T[k+1]=T[i] then inc(k);
Prefix[i]:=k;end;
k:=0;
for i:=1 to n do begin
while(k>0)and(T[k+1]<>S[i])do k:=Prefix[k];
if T[k+1]=S[i] then inc(k);
fix[i]:=k;end;
for i:=2 to N do fix[i]:=max(fix[i],fix[i-1]);
end;
procedure change(var s,t:ansistring);
var i,n:integer;
begin
n:=length(s);t:=s;
for i:=1 to n do T[i]:=S[n-i+1];
end;
function cansee:boolean;
var i:integer;
begin
readln(T1);m:=length(T1);
cansee:=false;
if(m>1)and(m<=n) then
begin
change(T1,T2);
KMP(S1,T1,L);KMP(S2,T2,R);
for i:=1 to n-1 do
if(L[i]+R[n-i]>=m)
then exit(true);
end;
end;
begin
openfile;readln(S1);
n:=length(S1);
change(S1,S2);
readln(V);
for i:=1 to V do
if cansee
then inc(ans);
writeln(ans);closefile;
end.
C Xor & Sum 感觉完全做不来
总结 就当复习KMP了。另外我B题KMP函数这个写法,不会爆栈吧,既然都是变参了。怎么看我程序占用的栈空间?200分可以排第4,但是我只做了100….