csu 1328: 近似回文词

1328: 近似回文词

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 394  Solved: 144

[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

直接暴力枚举回文中心。

路过的知道为什么for(j=-1,k=1;j>=0,k<2;j--,k++);执行后j=-2,因为这个错了好多次。。

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#include<string>
#define ll long long
#define N 1110

using namespace std;

int n,m;

char s[N],s1[N];
int num[N];

int main() {
    //freopen("in.txt","r",stdin);
    int ca=1;
    while(~scanf("%d",&m)) {
        getchar();
        gets(s);
        int len=strlen(s);
        int k=0;
        for(int i=0; i<len; i++) {
            if(s[i]>='A'&&s[i]<='Z') {
                s1[k]=s[i]+32;
                num[k++]=i;
            } else if(s[i]>='a'&&s[i]<='z') {
                s1[k]=s[i];
                num[k++]=i;
            }
        }
        s1[k]='\0';
        int Max=1;
        int l=0;
        for(int i=0; i<k; i++) {
            int w=m;
            int j,jk;
            for( j=i-1,jk=i+1; ; j--,jk++) {///以i为中心点
                if(j<0||jk>=k)break; ///不知道为什么,这个放for()里,就错了,求告知
                if(s1[j]!=s1[jk]&&w==0) {
                    break;
                }
                if(s1[j]!=s1[jk])
                    w--;
            }
            j++,jk--;
            if(j<=jk) {
                if(num[jk]-num[j]+1>Max) {
                    Max=num[jk]-num[j]+1;
                    l=num[j];
                } else if(num[jk]-num[j]+1==Max) {
                    l=min(l,num[j]);
                }
            }
            w=m;
            for(j=i,jk=i+1; ; j--,jk++) {///以i和i+1中间为中心点
                if(j<0||jk>=k)break;
                if(s1[j]!=s1[jk]&&w==0) {
                    break;
                }
                if(s1[j]!=s1[jk])
                    w--;
            }
            j++,jk--;
            if(j<=jk) {
                if(num[jk]-num[j]+1>Max) {
                    Max=num[jk]-num[j]+1;
                    l=num[j];
                } else if(num[jk]-num[j]+1==Max) {
                    l=min(l,num[j]);
                }
            }
        }
        printf("Case %d: %d %d\n",ca++,Max,l+1);
    }
}
时间: 2024-12-07 19:00:55

csu 1328: 近似回文词的相关文章

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

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然后向两边扩展,当扩展到 k 大于要求的K的时候停止扩展,不断更新最长的长度跟开始位置最小.我先做了个预处理,先求出了a(S),然后用一个数组保存了a(S)中的字符在原来的字符串中对应的位置在哪,这样便于字符串比较,而且又可以在O(1)时间得到在原来串中的长度跟开始的位置. 1 #include<cs

csuoj 1328: 近似回文词

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 355  Solved: 138 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同

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

原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串连续出现的字符 串片段.回文的含义是:正着看和倒着看是相同的,如abba和abbebba.在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首 尾不要输出多余的字符串).输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组). 输入 :每行有一个

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

近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 Mean: 略. analyse: 直接暴力枚举每一个终点,然后枚举回文串的半径即可. Time complexity:O(n*m) Source code: // Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-10-03-14.25 #include<algorithm> #include

Vijos1327回文词

回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符串变成回文词所需插入的最少字符数. 比如字符串"Ab3bd",在插入两个字符后可以变成一个回文词("dAb3bAd"或"Adb3bdA"). 然而,插入两个以下的字符无法使它变成一个回文词. 输入格式: 文件的第一行包含一个整数N,表示给定的字符串的

UVA 401 Palindromes(回文词)

 回文词 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 401 Appoint description:  acmparand  (2013-07-07)Luke  (2014-01-20) System Crawler  (2015-05-10) Description A regular palindrome is a string of

UVa401 回文词

Palindromes A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is a palindrome because it is the same when the string is read from left to right as when the string is

回文词

#include <iostream> #include <stdio.h> #include <iomanip> #include <string> using namespace std; const char *rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";//字符A-9的镜像字符,没有镜像则为空格 const char * msg[] = {"not a palindrome",&

【Vijos 1327】回文词(DP)

题目描述 回文词是一种对称的字符串——也就是说,一个回文词,从左到右读和从右到左读得到的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数.   比如字符串“Ab3bd”,在插入两个字符后可以变成一个回文词(“dAb3bAd”或“Adb3bdA”).然而,插入两个以下的字符无法使它变成一个回文词. 输入 第一行包含一个整数N,表示给定字符串的长度,3<=N<=5000   第二行是一个长度为N的字符串,