usaco1.3.3 Calf Flac 我的题解

【问题描述】

据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。

在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。

我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。

PROGRAM NAME: calfflac

INPUT FORMAT: (file calfflac.in)

输入文件不会超过20,000字符。这个文件可能一行或多行,但是每行都不超过80个字符(不包括最后的换行符)。

OUTPUT FORMAT: (file calfflac.out)

输出的第一行应该包括找到的最长的回文的长度。

下一行或几行应该包括这个回文的原文(没有除去标点符号、空格),把这个回文输出到一行或多行(如果回文中包括换行符)。

如果有多个回文长度都等于最大值,输出最前面出现的那一个。

SAMPLE INPUT
Confucius say: Madam, I'm Adam.
SAMPLE OUTPUT
11
Madam, I'm Adam

【问题分析】

没想太多 直接dp,搜索超时  贴代码

  1 {
  2 
  3 ID:fuzhong2
  4 
  5 PROG:calfflac
  6 
  7 LANG:PASCAL
  8 
  9 }
 10 
 11 var
 12 
 13   ch,cha:array[1..20000]of char;
 14 
 15   pos,f:array[1..20000] of longint;
 16 
 17   i,p,pp,max,maxp:longint;
 18 
 19 
 20 
 21 function pd(c:char):boolean;
 22 
 23   begin
 24 
 25     if (97<=ord(c)) and (ord(c)<=122)  then exit(true);
 26 
 27 if (65<=ord(c)) and (ord(c)<=90)  then exit(true);
 28 
 29 exit(false);
 30 
 31 end;
 32 
 33 procedure print(p,max:longint);
 34 
 35   begin
 36 
 37    while max<>0 do
 38 
 39      begin
 40 
 41      write(ch[p]);
 42 
 43      inc(p);
 44 
 45      if pd(ch[p-1]) then dec(max);
 46 
 47      end;
 48 
 49   end;
 50 
 51   begin
 52 
 53   assign(input,'calfflac.in');reset(input);
 54 
 55   assign(output,'calfflac.out');rewrite(output);
 56 
 57   p:=0;pp:=0;
 58 
 59   while not eof(input) do
 60 
 61     begin
 62 
 63       inc(p);
 64 
 65       read(ch[p]);
 66 
 67       if pd(ch[p]) then begin inc(pp);pos[pp]:=p;cha[pp]:=lowercase(ch[p]); end;
 68 
 69     end;
 70 
 71   fillchar(f,sizeof(f),0);
 72 
 73 for i:= 1 to pp do
 74 
 75   f[i]:=i;
 76 
 77 for i:=3 to pp do
 78 
 79    begin
 80 
 81      if cha[i]=cha[i-1] then f[i]:=i-1;  //dp部分
 82 
 83      if cha[i]=cha[f[i-1]-1] then f[i]:=f[i-1]-1;
 84 
 85    end;
 86 
 87    max:=0;
 88 
 89    maxp:=0;
 90 
 91 for i:= 1 to pp do
 92 
 93   begin
 94 
 95     if i-f[i]>max then  begin max:=i-f[i]+1; maxp:=f[i]; end;
 96 
 97   end;
 98 
 99   writeln(max);
100 
101   print(pos[maxp],max);
102 
103   writeln;
104 
105   close(input);
106 
107   close(output);
108 
109   end.

 

posted @ 2012-10-27 09:23  付忠庆  阅读(138)  评论(0编辑  收藏  举报