您的位置:首页 > 其它

回文词

2016-01-31 18:46 239 查看
1、回文词(words.pas/c/cpp)

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

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

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

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

【输入样例】

3

Confucius say: Madam,I'm Adam.

【输出样例】

Madam

Madam, I'm Adam

m Adam

3

【数据规模】 对于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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: