csuoj 1328: 近似回文词
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: 近似回文词的更多相关文章
- CSU 1328: 近似回文词
省赛的A题...现场都没什么人做...其实就一暴力水题......坑死了... 1328: 近似回文词 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1 ...
- CSU 1328 近似回文词【最长回文字符串(三种方法)】
输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把 ...
- CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...
- csu-1328 近似回文词 和 最长回文字符串
原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是: ...
- 字符串 - 近似回文词 --- csu 1328
近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 analyse: 直接暴力枚举每一个终点,然后枚举 ...
- 401 Palindromes(回文词)
Palindromes A regular palindrome is a string of numbers or letters that is the same forward as ba ...
- Vijos1327回文词【动态规划】
回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符 ...
- 回文词_KEY
回文词 (palin.pas/c/cpp) [问题描述] 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个 ...
- 回文词 (Palindromes,Uva401)
例题 3-3 回文词 (Palindromes,Uva401) 输入一个字符中,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓回文串,就是反转以后和原串相同,如abba和madam.所有 ...
随机推荐
- Java中的可变参数以及foreach语句
Java中的可变参数的定义格式如下: 返回值类型 方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型 变量名称 :数据名称){ ... } public ...
- sql server 数据库连接配置在外面 如何读取
注意:web运行读取要把配置文件放在WEB-INF下面 Driver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver:// ...
- Freemarker的初次使用之FTL标签嵌套与map的使用
入职第二周了,在熟悉了公司自动化测试脚本的编写(使用什么数据库,使用哪种语言,框架带了哪些方法)后,现在开始熟悉模拟器,我们把请求发到服务器1,服务器1根据请求参数处理后将结果发给模拟器,模拟器根据服 ...
- session和cookie区别
<?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...
- 1014 C语言文法
<程序> -> <外部声明> | <程序> <外部声明> <外部声明> -> <函数定义> | <声明> ...
- Mac废纸篓 不能完全清空的有效解决方法
摘自:http://www.neonan.com/articles/5582 对于苹果用户来说, 可能都会遇到过这样的情况(尽管这种情况是不常出现的!), Mac OS X系统突然出现一些顽固的文件家 ...
- Truncate table
Truncate是一个能够快速清空资料表内所有资料的SQL语法.并且能针对具有自动递增值的字段,做计数重置归零重新计算的作用.
- qt 屏幕旋转
qt屏幕旋转的方法 参考链接 http://mikenoodle.blog.163.com/blog/static/11333522010102754154616/ http://blog.csdn. ...
- java发展道路
1.
- iOS Auto Layout
Auto Layout是什么 Auto Layout是一个基于constraint(约束)的布局系统,它根据UI元素之间约束关系来调整UI元素的位置和大小. Auto Layout解决什么问题 更容易 ...