题目: | calfflac | |
来源: | Usaco1.3.3 | |
题目大意: | 求一句话中最长的除标点外的回文,并输出它的长度及包含标点时的样子 | |
数据范围: | 不超过20,000个字符的字符串、最长的回文不会超过2,000个字符(在除去标点符 号、空格之前) | |
样例: |
Confucius say: Madam, I'm Adam. |
11 Madam, I'm Adam |
做题思路: | 以每个点为回文中点枚举,数据很弱所以奇偶不必考虑太多,要考虑这个逐字节比较 的usaco,还有可能一行读不下所以用eoln的话。。。 | |
知识点: | 判断回文长度,枚举 |
{
ID:Dount Nameless
TASK:calfflac
LANG:PASCAL
}
var
a,c:array[0..20000]of char;
b:array[0..20000]of longint;
st,ed,i,j,n,ans,k,l:longint;
begin
assign(input,'calfflac.in');reset(input);
assign(output,'calfflac.out');rewrite(output);
i:=1;
whilenot eof do
begin
read(a[i]);
inc(j);
b[i]:=j;
c[j]:=a[i];
ifa[i] in ['a'..'z'] then a[i]:=chr(ord(a[i])-32);{<小字母转大字母,因为我看着大的顺眼些,大转小也行>}
if(a[i] in ['A'..'Z'])then inc(i);{<把字母和句子剥离省的一会判断回文时麻烦>}
end;
l:=i-1;
fori:=2 to l-1 do{<枚举中点,中点的话不会是两边的点吧,那直接输出不就好了>}
begin
if(a[i]=a[i-1])and(a[i-1]<>a[i+1])then j:=i-1 else j:=i;{<本来向判断奇偶的不知道用没用或者对没对>}
k:=i;
while (a[k]=a[j])and(j>0)and(k<l+1) do{<判断回文长度>}
begin
inc(k);dec(j);
end;
ifans<k-j-1 then
begin
ans:=k-j-1;
st:=j+1;
ed:=k-1;
end;
end;
writeln(ans);
ifans=1 then writeln(a[1])
else
for i:=b[st] to b[ed] do{<输出回文(原文)>}
write(c[i]);
writeln;
close(input);close(output);
end.
题目来源:
http://ace.delos.com/usacoprob2?a=RexmW8CclSt&S=calfflac