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);
}