HDU 1544 Palindromes(回文子串)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1544

问题分析:

问题要求求出字符串的连续子串中的回文子串个数。首先,需要区分连续子串与子序列的区别。

连续子串为连续的字符组成的字符串;子序列需要满足在子序列中出现的字符的相对顺序与字符串中出现的相对顺序相同。

问题的解法:根据回文子串的长度分为奇数与偶数分为两种可能;

1.当回文子串长度为奇数时,中间的字符为任意字符,取除了字符串最左边与最右边的字符的其他字符,通过向两边拓展来判断

奇数回文子串的个数。

2.当回文子串长度为偶数时,通过选取除了最后一个字符外的其他字符作为基本字符,向两边拓展来求取偶数的回文子串的个数。

3.将偶数的回文子串的个数与奇数的回文子串的个数,字符串的字符个数相加即为所求。

代码如下:

#include <stdio.h>
#include <string.h>

const int MAX_N = 5000 + 10;
char str[MAX_N];

int main()
{
    while (scanf("%s", str) != EOF)
    {
        int ans = 0;
        int len = strlen(str);
        int left, right;

        for (int i = 1; i < len - 1; ++ i)
        {
            left = i - 1;
            right = i + 1;
            while (left >= 0 && right < len && str[left] == str[right])
                    ans++, left--, right++;
        }

        for (int i = 0; i < len - 1; ++ i)
        {
            if (str[i] == str[i+1])
            {
                ans++;
                left = i - 1;
                right = i + 2;
                while (left >= 0 && right < len && str[left] == str[right])
                        ans++, left--, right++;
            }
        }
        printf("%d\n", ans + len);
    }
    return 0;
}
时间: 2024-10-20 08:54:09

HDU 1544 Palindromes(回文子串)的相关文章

hdu 1544 连续回文子串的个数 构造法

思路: 子串的长度只能为奇数或偶数(长度为1的不算,直接特判). 对于长度为奇数的子串,以2到n之间的数为该子串的中心,然后分别向两边扩展,只要碰到一个子串扩展不满足回文的,就退出. 对于偶数长度的子串分别以1到n - 1之间的数为左,该数右边的数为右,组成两个数,然后再拿这两个数扩展. 代码: #include <queue> #include <set> #include <map> #include <stack> #include <strin

hdu 1318 Palindromes(回文词)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1318 题意分析:输入每行包含一个字符串,判断此串是否为回文串或镜像串. 表面上看这道题有些复杂,如果能熟练运用字符数组的话,代码也颇为简洁.. /*Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 657 Accepted

Best Reward HDU 3613(回文子串Manacher)

题目大意:有一个串(全部由小写字母组成),现在要把它分成两部分,如果分开后的部分是回文串就计算出来它的价值总和,如果不是回文的那么价值就是0,最多能得到的最大价值.   分析:首先的明白这个最大价值有可能是负数,比如下面: -1 -1 -1..... aaa 这样的情况不管怎么分,分出来的串都是回文串,所以得到的最大价值是 -3. 求回文串的算法使用的是Manacher算法,线性的复杂度.   代码如下: =============================================

hdu 5340 最长回文子串变形

http://acm.hdu.edu.cn/showproblem.php?pid=5340 Problem Description Can we divided a given string S into three nonempty palindromes? Input First line contains a single integer T≤20 which denotes the number of test cases. For each test case , there is

Petrozavodsk Winter-2013. Ural FU Contest Problem D. Five Palindromes manacher、一个串切割成5个回文子串、优化

Ural Federal University Contest, SKB Kontur Cup Petrozavodsk Winter Training Camp, Saturday, February 2, 2013 Problem D. Five Palindromes Input file: input.txt Output file: output.txt Time limit: 2 seconds (3 seconds for Java) Memory limit: 256 mebib

hdu 3068 Manacher算法 O(n)回文子串算法

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3068 关于算法的教程  推荐这个:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824    注意:我推荐的这篇博客里说的那个代码有bug,我觉得没问题,而是博主在用的时候写错了,博主举得反例我都过了 而且hdu 3068也过了 最开始是用的后缀数组,2000ms+ 果断超时............... 看过一遍很快就学会这个算法了:然后A

hdu 3068 最长回文(manacher&amp;最长回文子串)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

hdu 4513 最长回文子串

就是在最基础的回文子串中多加个判断条件就行 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int num1[100010],num2[200010]; int min(int a,int b) { return a<b?a:b; } int main() { int T,n,i,j; scanf("%d",&T); while(T

HDU 1513[Palindrome] 回文串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 题目大意:给一个字符串,问最少加多少个字母能成为回文串. 关键思想:要解决的是回文子序列问题而不是回文子串.回文子序列怎么求?可以把字符串倒转一下,再求他们的最长公共子序列啊!想一想为什么.求出LCS长度之后,n-LCS才是我们要的答案,因为对于不是回文子序列的其他字符来说,都需要给他们一个对象才能回文(对称).还有一个问题是我们开不了5000*5000的数组,但观察到递推方程是只与两个状态有