回文词

来源:互联网 发布:java培训班都教些什么 编辑:程序博客网 时间:2024/04/30 00:25

1、回文词(words.pas/c/cpp)
【问题描述】 CR 喜欢研究回文词,有天他发现一篇文章,里面有很多回文数,这使他来 了兴趣。他决定找出所有长度在 n 个字节以上的回文数。在寻找回文时不用理睬 那些标点符号、空格(但应该保留下来以便作为

答案输出) ,只用考虑英文字母 'A'-'Z'‘和'a'-'z'。 要你寻找的回文的文章是一个不超过 5,000个字符的字符串。 

【输入文件】(words.in) 第一行为要找的回文的长度 n。后面一行或几行为一个不超过 5,000 个字符 的字符串。 . 

【输出文件】( words.out) 输出的最后一行为找到的长度大于等于 n 的回文词的个数。 同一个回文中心 只算一组回文,并且输出这组回文最长的回文。前面一行或几行应该包括所有长 度大予等于 n 的回文词的原文(没有除去标点符号、空格) ,把这些回文输出到 一行或多行(如果回文中 包括换行符)。 如果有多个回文长度大于等于 n,全部输出所有回文。按回文中心在原文中 的出现顺序依次输出。 

【输入样例】 

Confucius say: Madam,I'm Adam. 

【输出样例】 

Madam 

Madam, I'm Adam 

m Adam 

【数据规模】 对于40%的数据: 在2000 个字符以内 对于100%的数据: 在5000 个字符以内


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int pd[50003],sum[50003];
struct data
{
  int x,pos;
};data num[50003];
char s[50003];
int i,j,n,m,ans,len;
void shuchu(int start,int end)
{
    for (int i=num[start].pos;i<=num[end].pos;i++)
printf("%c",s[i]);
printf("\n");
return;
}
int main()
{
freopen("words.in","r",stdin);
freopen("words.out","w",stdout);
scanf("%d\n",&n);
len=0;
while ((s[len]=getchar())&&(s[len]!=EOF))
len++;
    for (i=0;i<len;i++)
     if (s[i]>=65&&s[i]<=90||s[i]>=97&&s[i]<=122)
      {
      pd[i+1]=0; sum[i+1]=sum[i]; m++; num[m].pos=i; 
      if (s[i]>=65&&s[i]<=90)
       num[m].x=s[i];
      else
       num[m].x=s[i]-32;
      }
     else
      pd[i+1]=1,sum[i+1]=sum[i]+1;
    for (i=1;i<=m;i++)
     {
      j=1;
      while (i-j>0&&i+j<=m&&num[i-j].x==num[i+j].x)
      j++;
      if ((j-1)*2+1>=n)
      {
      shuchu(i-j+1,i+j-1); ans++;
      }
      j=1;
      while (i-j+1>0&&i+j<=m&&num[i-j+1].x==num[i+j].x)
      j++;
if ((j-1)*2>=n)
      {
      shuchu(i-j+2,i+j-1); ans++;
      }
     }
    printf("%d\n",ans);
}
0 1
原创粉丝点击