[ACdream]女神教你字符串——导字符串

Problem Description

正如大家知道的,女神喜欢字符串,而在字符串中,女神最喜欢回文字符串,但是不是所有的字符串都是回文字符串,但是有一些字符串可以进行“求导”来变成回文字符串。

字符串中只包含小写字母。
求导过程如下,C++:

string dif(const string x)
{
    if(x.length()<=1)
        return "";
    string res="";
    for(int i=1;i<x.length();++i)
        res+=abs(x[i]-x[i-1])+‘a‘;
    return res;
}

C:

void dif(char*x,char*res)//注意有可能会溢出
{
    if(x[0]==0||x[1]==0)
    {
        res[0]=0;
        return;
    }
    int len=1;
    for(int i=1;x[i];++i,++len)
        res[i-1]=abs(x[i]-x[i-1])+‘a‘;
    res[len-1]=0;
}

例如"aa"的导字符串是“a",”aab“的导字符串是"ab","aacfwssg"的导字符串是"acdream"。

那么给定一个字符串,请判断在它各阶导字符串中,最长的回文串是多长?

二阶导字符串即为导字符串的导字符串。

n阶导字符串即为n-1阶导数的导字符串。

Input

多组数据,每组数据包括一个字符串s(1<=|s|<=1000)

Output

对于每组数据,输出一个整数

Sample Input

abcd
abcba
acdream

Sample Output

3
5
3

Hint

样例一,求一次导字符串后为”aaa“,最长回文子串就是本身,所以长度为3

样例二,本身就是回文串,因此,输出本身长度即可

样例三,acdream->cbonem->bnbji->mmib->aeh->ed->b

最长回文串长度分别为1,1,3,2,1,1,1,因此输出3

解题思路:

核心就是求最大回文串,但是又不是直接求的,是要求不停的求异后的最大回文串,这题就是由于数据不大,直接从本身到求异后,调用Manacher算法就可以找到最大回文串,然后求最大的就可以了!

AC代码:

#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
char ss[2005],s[2005],res[3005];
int p[2005];

void dif(char *s,char *res)
{
    if(s[0]==0||s[1]==0)
    {
        res[0]=0;
        return;
    }
    int len=1;
    for(int i=1;s[i];++i,++len)
        res[i-1]=abs(s[i]-s[i-1])+‘a‘;
    res[len-1]=0;
}
int Manacher(char *s)
{
    int len = strlen(s), maxp = 0, ans = 0;
    for(int i = len; i >= 0; i--)
    {
        s[i * 2 + 2] = s[i];
        s[i * 2 + 1] = ‘#‘;
    }
    s[0] = ‘*‘;
    for(int i = 2; i < 2 * len + 1; i++)
    {
        if(p[maxp] + maxp > i)
            p[i] = min(p[2 * maxp - i], p[maxp] + maxp - i);
        else
            p[i] = 1;
        while(s[i - p[i]] == s[i + p[i]])
            p[i]++;
        if(p[maxp] + maxp < i + p[i])
            maxp = i;
        if(ans < p[i])
            ans = p[i];
    }
    return ans - 1;
}
int main()
{
    int max1;
    while(gets(s))
    {
        max1=0;
        while(strlen(s)>1)
        {
            memset(p,0,sizeof(p));
            strcpy(ss,s);
            max1=max(max1,Manacher(ss));
            dif(s,res);
            strcpy(s,res);
            if(max1>=strlen(s)) break;
        }
        printf("%d\n",max1);
    }
    return 0;
}
时间: 2024-10-14 06:24:56

[ACdream]女神教你字符串——导字符串的相关文章

[ACdream] 女神教你字符串——三个气球

Problem Description 女神邀请众ACdream开联欢会,显然作为ACM的佼佼者,气球是不能少的~.女神准备了三种颜色的气球,红色,黄色,绿色(交通信号灯?) 有气球还不能满足女神,女神要在气球上写字. 写什么好呢~?字符串神马的最有爱了~ 女神先拿出一个字符串,然后把字符串的每一个真·前缀写到了黄色气球上面,每一个真·后缀写到了绿色气球上面,每一个真·子串写到了红色气球上面. 对于一个字符串s[1...n],真·前缀为s[1...i](1<=i<n)·,真·后缀为s[j...

[ACdream]女神教你字符串——违和感

题目描述: 女神最喜欢字符串了,字符串神马的最有爱了. 女神是一个重度强迫症患者,面对不是对称的东西,她会觉得太违和了,就会爆炸.所以她手上的字符串都是回文的,像什么a,b,aabaa,abcba,上海自来水来自海上...等等. 女神的人生理想就是把所有字符串都改造成回文串!这是非常宏伟的理想. 一切理想都从最简单的开始. 好了,现在女神面前有一堆字符串,然后请问能否通过删去一个字符,使这个字符串变成回文串? Input 多组数据,每组数据是一个字符串S,仅有英文小写字母组成 1<=|S|<=

*字符串-05. 字符串循环左移

1 /* 2 * Main.c 3 * D5-字符串-05. 字符串循环左移 4 * Created on: 2014年8月19日 5 * Author: Boomkeeper 6 ********部分通过******* 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 char str[100]={0}; 14 int N=0; 15 int endIndex=99;//字符串的结尾标识符 16 17 gets(str); 18

字符串-04. 字符串逆序

1 /* 2 * Main.c 3 * D4-字符串-04. 字符串逆序 4 * Created on: 2014年8月19日 5 * Author: Boomkeeper 6 *******测试通过****** 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 char str[80]; 14 15 gets(str); 16 17 int i; 18 for(i=0;i<80;i++){ 19 if(str[i]=='\0

字符串-05. 字符串循环左移(20)

输入一个字符串和一个非负整数N,要求将字符串循环左移N次. 输入格式: 输入在第1行中给出一个不超过100个字符长度的.以回车结束的非空字符串:第2行给出非负整数N. 输出格式: 在一行中输出循环左移N次后的字符串. 输入样例: Hello World! 2 输出样例: llo World!He import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(St

以写代学:python 原始字符串操作符&&字符串内建函数

原始字符串操作符 (1)原始字符串操作符是为了对付那些在字符串中出现的特殊字符 (2)在原始字符串里,所有的字符都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符 (3)比如在windows写路径时经常会把出现以下情况 2.字符串内建函数 (1)每次都不会改变字符串原本的值 (2)字符串.函数 或者将字符串赋值给函数后写成变量名.函数是都可以的 (3)还有很多的内涵函数,下边只是举例说明 >>> import tab        >>> hi = "

javascript中字符串和字符串变量的问题

var s = new String("hello"); s.indexOf(1) = 'p'; //错误,indexof()是函数 s[1]='p' //错误,在c和c++可以改变字符串变量元素的值,但这里貌似有问题 alert(s); //显示“hello” var s = new String("Visit Microsoft!") var a=s.replace(/Microsoft/, "W3School") alert(a); ale

字符串-04. 字符串逆序(15)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串. 输入格式: 输入在一行中给出一个不超过80个字符长度的.以回车结束的非空字符串. 输出格式: 在一行中输出逆序后的字符串. 输入样例: Hello World! 输出样例: !dlroW olleH import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scann

C#比较字符串及字符串常用函数

C#比较字符串及字符串常用函数示例2007年08月26日 星期日 下午 02:29用C#比较字符串有多种方法,如: 1. string.Compare(x,y);2. string.Equals(x,y) ; 如果要不区分大小写进行比较,则对应为:string.Compare(x,y);string.Equals(x,y); 注:string.Compare比较结果的含义: 值含义 小于零x 小于 y. 或 x 为 空引用(在 Visual Basic 中为 Nothing). 零x 等于 y.