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.所有 ...
随机推荐
- P1443 马的遍历
同样是一个bfs水题... #include <bits/stdc++.h> using namespace std; typedef pair<int, int> St; S ...
- spring-3-mvc-hello-world-example
http://www.mkyong.com/spring3/spring-3-mvc-hello-world-example/
- CDH介绍
本文引用自:Cloudera 系列2:CDH介绍http://www.aboutyun.com/thread-18379-1-1.html(出处: about云开发) CDH提供: 灵活性-存储任何类 ...
- Kib Kb KB KIB 区别
今天和同事聊了一下Kib Kb KB KIB这几个单位的含义及其区别,自己在网上也查了查资料,总结如下: Ki 和 K 只是数学单位 Ki = 1024 K = 1000 这二者之间没有任何联系 B ...
- IdTcpClient简单示例
procedure TForm1.btnHttpGetClick(Sender: TObject); begin idtcpclnt1.Host := '192.168.10.88'; idtcpcl ...
- CSS之display:block与display:inline-block
1.<span style="display:block; border:red solid 1px; width:100px"></span> 行级元素是 ...
- PushKit和传统长连接方式的比较
iOS and PushKit This post will cover basic concepts for VoIP apps on iOS. I will not post any code ( ...
- java调用Http请求 -HttpURLConnection学习
最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放 ...
- LeetCode -- Triangle 路径求最小和( 动态规划问题)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- 一个短小的JS函数,用来得到仅仅包含不重复元素的数组
下面函数主要利用了数组的sort方法,之后的逻辑是看最后一个元素是否等于要添加的元素,如果不是就往尾后加. 这个做法的效率等于sort方法的效率,还过得去. 代码: <!DOCTYPE HTML ...