http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328

1328: 近似回文词

Time Limit: 1 Sec  Memory Limit: 128 MB

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

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

Sample Output

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

HINT

 

Source

湖南省第九届大学生计算机程序设计竞赛

分析:

暴力模拟(有人说会有TLE,但是我就AC啦,RP吧)即可, 还可以从某个点往两边分别比较。

AC代码:

 #include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <list>
#include <iomanip>
#include <vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma warning(disable:4786) using namespace std; const int INF = 0x3f3f3f3f;
const int MAX = + ;
const double eps = 1e-;
const double PI = acos(-1.0); char str[MAX] , hw[MAX];
int chang[MAX];
int k; int main()
{
int cas = ;
while(~scanf("%d",&k))
{
getchar();
gets(str);
int len = strlen(str);
int cnt = ;
for(int i = ;i < len;i ++)
{
if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
{
char c = str[i];
if(c >= 'A' && c <= 'Z')
c = c - 'A' + 'a';
chang[cnt] = i;
hw[cnt ++] = c;
}
}
hw[cnt] = '\0';
int maxlen = , pos = ;
for(int j = cnt;j >= ;j --)
for(int i = ;i + j - < cnt;i ++)
{
int st = i + j - ,cnt = ;
int len = chang[st] - chang[i] + ;
if(len < maxlen)
continue;
for(int l1 = i,l2 = st;l1 < l2;l1 ++ , l2 --)
{
if(hw[l1] != hw[l2])
cnt += ;
if(cnt > * k)
break;
}
if(cnt <= * k)
{
if(maxlen < len || (maxlen == len && i < pos))
{
maxlen = len;
pos = i;
}
}
}
printf("Case %d: %d %d\n",cas ++ , maxlen , chang[pos] + );
}
return ;
}

这个是用往两边扩展写的,不会存在超时!!!

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<cmath>
#include<cctype>
using namespace std;
char s[],s1[];
int ans[];
int main()
{
int T=,k,i,j;
while(~scanf("%d",&k))
{
int a = ,kk=,start = ,flag;
getchar();
gets(s);
int len = strlen(s);
for( i=;i<len;i++)
{
if(isalpha(s[i])) //判断是否是字母
{
ans[kk] = i;
s1[kk] = toupper(s[i]);//转换成大写字母
kk++;
}
}
for( i=; i<kk; i++)
{
flag = ;
for( j=;i-j>= && i+j<kk; j++)//奇数个时;
{
if(s1[i-j]!=s1[i+j])
flag++;
if(flag>k)
break;
}
j--;
if(ans[i+j]-ans[i-j]+>a)
{
a = ans[i+j]-ans[i-j]+;
start = ans[i-j];
}
flag = ;
for( j=; i-j>= && i+j+<kk; j++)//偶数个时
{
if(s1[i-j]!=s1[i+j+])
flag ++;
if(flag>k)
break;
}
j--;
if(j<=-)
continue;
if(ans[i+j+]-ans[i-j]+>a)
{
a = ans[i+j+]-ans[i-j]+;
start = ans[i-j];
}
}
printf("Case %d: %d %d\n",T++,a,start+);
}
return ;
}

csuoj 1328: 近似回文词的更多相关文章

  1. CSU 1328: 近似回文词

    省赛的A题...现场都没什么人做...其实就一暴力水题......坑死了... 1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1 ...

  2. CSU 1328 近似回文词【最长回文字符串(三种方法)】

    输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把 ...

  3. CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...

  4. csu-1328 近似回文词 和 最长回文字符串

    原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是: ...

  5. 字符串 - 近似回文词 --- csu 1328

    近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 analyse: 直接暴力枚举每一个终点,然后枚举 ...

  6. 401 Palindromes(回文词)

      Palindromes  A regular palindrome is a string of numbers or letters that is the same forward as ba ...

  7. Vijos1327回文词【动态规划】

    回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符 ...

  8. 回文词_KEY

    回文词 (palin.pas/c/cpp) [问题描述] 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个 ...

  9. 回文词 (Palindromes,Uva401)

    例题 3-3 回文词 (Palindromes,Uva401) 输入一个字符中,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓回文串,就是反转以后和原串相同,如abba和madam.所有 ...

随机推荐

  1. ant

    condition逻辑判断: <project name="testCondition"> <target name="test"> & ...

  2. 弹窗文件js+css

    // 每个弹窗的标识 var x =0; var idzt = new Array(); var Window = function(config){ //ID不重复 idzt[x] = " ...

  3. c# ToString() 用法

    string tempa = Convert.ToString(31, 2);//将10进制数31转换为2进制字符串. string strNums = int.Parse(tempa).ToStri ...

  4. 【Android测试】【第二节】性能——CPU时间片

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5143192.html 前言 第一节讲CPU的时候留下了一个 ...

  5. php--tp中页面之间的跳转

  6. C#中扩展方法

    什么是扩展方法? 扩展方法顾名思义,就是允许向现有的“类型”添加方法,而无需创建派生类.重新编译或以其他方式修改原来类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 扩 ...

  7. Java实验五报告——TCP传输及加解密

    一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...

  8. LightOj1056 - Olympics(简单数学题)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1056 题意:已知体育场的形状是由一个矩形+两边的两个部分组成,两边的两个部分是属于同一 ...

  9. ibatis传入数组或List

    小结一下ibatis框架下,传入参数为数组类型或者是List类型的sql写法.标签里面都不需要表名 1.传入字符串数组,不需要标明parameterClasss,数组和List类型对象一样都可以用&l ...

  10. HBASE架构解析(二)

    http://www.blogjava.net/DLevin/archive/2015/08/22/426950.html HBase读的实现 通过前文的描述,我们知道在HBase写时,相同Cell( ...