USACO-Chapter1-Section 1.3-Calf Flac (calfflac)
【题目描述】
据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。
在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。
【输入格式】
输入文件不会超过20,000字符。这个文件可能一行或多行,但是每行都不超过80个字符(不包括最后的换行符)。
【输出格式】
输出的第一行应该包括找到的最长的回文的长度。
下一行或几行应该包括这个回文的原文(没有除去标点符号、空格),把这个回文输出到一行或多行(如果回文中包括换行符)。
如果有多个回文长度都等于最大值,输出最前面出现的那一个。
【输入样例】
Confucius say: Madam, I'm Adam.
【输出样例】
11 Madam, I'm Adam
【思路】
枚举中间点,然后向两端扩展找回文,0000000000100000000,比如,枚举到1这个位置,那么此时分两种情况:①以1为中间点,向两头扩。②以1和1的左边为对称向两头扩,也就是当串长为奇数偶数的情况分类。这道题蛋疼的是回车也要输出,我使用的eof来把每行读入的字符串连起来,但是没办法输出空格,怎么办?于是我用了一个数组A来记录每行末尾在哪里,然后输出地时候判断下此位置是不是行末,然后判断换行。
注意:ansistring
【代码】
时间复杂度:O(n*(2*k)) k∈(0,n)
空间复杂度:(不再考虑)
- Executing...
- Test 1: TEST OK [0.000 secs, 468 KB]
- Test 2: TEST OK [0.000 secs, 468 KB]
- Test 3: TEST OK [0.000 secs, 468 KB]
- Test 4: TEST OK [0.000 secs, 468 KB]
- Test 5: TEST OK [0.000 secs, 468 KB]
- Test 6: TEST OK [0.000 secs, 468 KB]
- Test 7: TEST OK [0.000 secs, 468 KB]
- Test 8: TEST OK [0.292 secs, 468 KB]
- All tests OK.
{
ID : c_CaM.19
LANG: PASCAL
TASK: calfflac
}
Program CaM(input,output);
Var
a:array[0..50000] of longint;
ax,ay,tx,ty,ans,tot,i,j,ff,k,l,ll:longint;
s,ss:ansistring;
Procedure innt;
Begin
assign(input,'calfflac.in'); reset(input);
assign(output,'calfflac.out'); rewrite(output);
End;
Procedure outt;
Begin
close(input);
close(output);
End;
Begin
innt;
while not eof do
Begin
readln(ss);
ll:=ll+length(ss);
inc(a[ll]);
s:=s+ss;
End;
l:=length(s);
for k:=1 to l do
Begin
i:=k; j:=k; ff:=0; tot:=0;
if not (upcase(s[k]) in ['A'..'Z']) then continue;
while (i>=1)and(j<=l)and(ff=0) do
Begin
while not (upcase(s[i]) in ['A'..'Z']) do dec(i);
while not (upcase(s[j]) in ['A'..'Z']) do inc(j);
if upcase(s[i])<>upcase(s[j]) then ff:=1
else
Begin
tx:=i; ty:=j;
inc(tot,2);
dec(i);
inc(j);
End;
End;
dec(tot);
if tot>ans then
Begin
ax:=tx; ay:=ty;
ans:=tot;
End;
i:=k; j:=k+1; ff:=0; tot:=0;
while (i>=1)and(j<=l)and(ff=0) do
Begin
while not (upcase(s[i]) in ['A'..'Z']) do dec(i);
while not (upcase(s[j]) in ['A'..'Z']) do inc(j);
if upcase(s[i])<>upcase(s[j]) then ff:=1
else
Begin
tx:=i; ty:=j;
inc(tot,2);
dec(i);
inc(j);
End;
End;
if tot>ans then
Begin
ax:=tx; ay:=ty;
ans:=tot;
End;
End;
writeln(ans);
for i:=ax to ay do
Begin
write(s[i]);
if a[i]=1 then writeln;
End;
if a[i]=0 then writeln;
outt;
End.
浙公网安备 33010602011771号