欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

zcmu-1661

发布时间:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的这篇文章主要介绍了 zcmu-1661 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1661: 近似回文词

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 50  Solved: 7
[Submit][Status][Web Board]

Description

 输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串:

1. S以字母开头,字母结尾

2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符之后得到的串,b(S)是a(S)的逆序串。

比如当k=1时,Race cat是一个近似回文词,因为a(S)=racecat和b(S)=tacecar只有2个位置不同。

Input

输入包含不超过25组数据,每组数据包含两行。第一行是整数k(0<=k<=200),第二行为字符串S,包含不超过1000个字符(换行符不算)。S只包含字符、空格和其他可打印字符(比如逗号,句号),并且不会以空白字符开头。

Output

 对于每组测试数据,输出最长近似回文子串的长度和起始位置(S的第一个字符是位置1)。如果有多个最长近似回文子串解,起始位置应尽量小。

Sample Input

1Wow, it is a Race cat!0abcdefg0Kitty: Madam, I'm adam.

Sample Output

Case 1: 8 3Case 2: 1 1Case 3: 15 8


思路:刘乳佳的一个回文串的改编,此题从字符串的中间开始查找,发现很多找字符串都是从中间开始查找的,分长度为奇数和偶数,用一个数组记录下标。


代码:

#include<cstdio> #include<iostream> #include<cstring> using namespace std; int main(){int k,n,i,j,t,f,x,y,p=1,c[1010];char a[1010],b[1010];while(~scanf("%d\n",&k)){gets(a);t=x=y=0;for(i=0;i<strlen(a);i++){if(a[i]>='A'&&a[i]<='Z')c[t]=i+1,b[t++]=a[i]-'A'+'a';else if(a[i]>='a'&&a[i]<='z')c[t]=i+1,b[t++]=a[i];}for(i=0;i<t;i++){f=0;for(j=0;i-j>=0&&i+j<t;j++){//长度为奇数if(b[i-j]!=b[i+j])f++;if(f>k)break;}j--;if(c[i+j]-c[i-j]+1>x){x=c[i+j]-c[i-j]+1;y=c[i-j];}f=0;for(j=0;i-j>=0&&i+j+1<t;j++){//长度为偶数if(b[i-j]!=b[i+j+1])f++;if(f>k)break;}j--;if(j!=-1&&c[i+j+1]-c[i-j]+1>x){x=c[i+j+1]-c[i-j]+1;y=c[i-j];}}printf("Case %d: %d %d\n",p++,x,y);} }


总结

以上是生活随笔为你收集整理的zcmu-1661的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。