【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 107646
  • 排名 - 231

最新评论

阅读排行榜

评论排行榜

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

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

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


INPUT FORMAT
一个不超过20,000个字符的文件。

OUTPUT FORMAT
输出的第一行应该包括找到的最长的回文的长度。
下一个行或几行应该包括这个回文的原文(没有除去标点符号、空格),
把这个回文输出到一行或多行(如果回文中包括换行符)。
如果有多个回文长度都等于最大值,输出那个前出现的。

SAMPLE INPUT (file calfflac.in)
Confucius say: Madam, I'm Adam.

SAMPLE OUTPUT (file calfflac.out)
11
Madam, I'm Adam

【参考程序】:
/*
ID: XIONGNA1
PROG: calfflac
LANG: C++
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
char s[20001];
int n,p,bx,by,ex,ey,ans;
bool tf(char c)
{
    
if (c>='A' && c<='Z'return true;
    
if (c>='a' && c<='z'return true;
    
return false;
}
bool check(char c1,char c2)
{
    
if ((c1>='a' && c1<='z')&&(c2>='a' && c2<='z'))
    {
        
if (c1==c2) return true;
        
return false;
    }
    
if ((c1>='a' && c1<='z')&&(c2>='A' && c2<='Z'))
    {
        
if (c1==(c2+32)) return true;
        
return false;
    }
    
if ((c1>='A' && c1<='Z')&&(c2>='a' && c2<='z'))
    {
        
if ((c1+32)==c2) return true;
        
return false;
    }
    
if ((c1>='A' && c1<='Z')&&(c2>='A' && c2<='Z'))
    {
        
if (c1==c2) return true;
        
return false;
    }
}
void work()
{
    
while (bx>=1 && by<=n)
    {
        
while (bx>=1 && (!tf(s[bx]))) bx--;
      
while (by<=&& (!tf(s[by]))) by++;
      
if (bx<1 || by>n) break;
        
if (!check(s[bx],s[by])) break;
      p
+=2;
        bx
--;by++;
    }
    
if (ans<p)
    {
        ans
=p;ex=bx+1;ey=by-1;
    }
}
int main()
{
    freopen(
"calfflac.in","r",stdin);
    freopen(
"calfflac.out","w",stdout);
    
char c;n=0;
    
while (scanf("%c",&c)!=EOF)
    {
        n
++;s[n]=c;
    }
    ans
=0;
    
for (int i=2;i<=n;i++)
        
if (tf(s[i]))
        {
            bx
=i-1;by=i+1;
            p
=1;work();
        }
    
for (int i=1;i<=n;i++)
        
if (tf(s[i]))
        {
            bx
=i;by=i+1;
            
while (by<=&& (!tf(s[by]))) by++;
            
if (check(s[bx],s[by]))
            {
                bx
--;by++;
                p
=2;work();
            }
        }
    
while (!tf(s[ex])) ex++;
    
while (!tf(s[ey])) ey--;
    printf(
"%d\n",ans);
    
for (int i=ex;i<=ey;i++) printf("%c",s[i]);
    printf(
"\n");
    
return 0;
}
posted on 2009-07-15 10:56 开拓者 阅读(488) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理