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.
posted @ 2012-02-21 00:03  你滴韩王  阅读(353)  评论(0)    收藏  举报