hdu 5340 Three Palindromes(字符串处理+ 回文)

hdu 5340 Three Palindromes

问题描述

判断是否能将字符串S分成三段非空回文串。

输入描述

第一行一个整数T,表示数据组数。T \leq 20T≤20

对于每一个组,仅包含一个由小写字母组成的串。1 \leq |S| \leq 200001≤∣S∣≤20000

输出描述

对于每一组,单行输出”Yes” 或 “No”。

输入样例

2

abc

abaadada

输出样例

Yes

No

题目大意:给出一个字符串,判断,是否能将其分成三个不为空的回文字符串。

解题思路:先用manacher算法求出以每一点为中心可以扩张的最长的回文串范围。然后可以求出两个数组pre[i]和pos[i],记录的是在i点做切割,可以使i之前的或之后的子字符串,成为回文字符串。求出pre和pos数组之后,遍历中间那一段字符串的中心点,每找到一个中心点,以它为中心向两边扩张 (1 < a < p[i] - 1)当pre[i - a]和pos[i + a]都被标记,则该切割是有效的。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20005;
char str[N<<1], s[N];
int p[N<<1], len, len2;
void manacher() {
    len = strlen(s);
    for(int i = 0; i < len; i++) {
        str[i<<1] = ‘#‘;
        str[(i<<1) + 1] = s[i];
    }
    str[len<<1] = ‘#‘;
    str[(len<<1) + 1] = ‘\0‘;
    len = strlen(str);
    int maxp = 0, id = 0;
    for(int i = 0; i < len; i++) {
        if(maxp > i) p[i] = min(maxp - i, p[(id<<1) - i]);
        else p[i] = 1;
        for(;str[i - p[i]] == str[i + p[i]] && i + p[i] < len && i - p[i] >= 0; p[i]++);
        if(i + p[i] > maxp) {
            maxp = p[i] + i;
            id = i;
        }
    }
}
bool A[40005], B[40005];
bool mark() {
    len = strlen(s);
    len2 = (len<<1)  + 1;
    memset(A, 0, len2);
    memset(B, 0, len2);
    if (len == 3) return true;
    if (len < 3) return false;
    for (int i = 1; i < len2; i++) {
        if (p[i] - 1 == i) A[i + (p[i] - 1)] = true;
        if (p[len2 - 1 - i] - 1 == i) B[len2 - 1 - i - (p[len2 - 1 - i] - 1)] = true;
    }
    for (int i = 1; i < len2 - 1; i++) {
        for (int j = 1; j < p[i]; j++) {
            if (A[i - j] & B[i + j]) {
                return true;
            }
        }
    }
    return false;
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%s", s);
        manacher();
        if (mark()) {
            printf("Yes\n");
        } else printf("No\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许也可以转载,不过要注明出处哦。

时间: 2024-11-02 08:43:41

hdu 5340 Three Palindromes(字符串处理+ 回文)的相关文章

UVa 401 Palindromes(字符串,回文)

 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 i

HDU 5371(Hotaru&#39;s problem-2次回文串)

Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2432    Accepted Submission(s): 841 Problem Description Hotaru Ichijou recently is addicated to math problems. Now she is playin

UVA - 11584 划分字符串的回文串子串; 简单dp

/** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单dp 题目大意: 给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串.问最少可以分割成多少个. 定义:dp[i]表示前0~i内的字符串划分成的最小回文串个数: dp[i] = min(dp[j]+1 | j+1~i是回文串); 先预处理flag[i][j]表示以i~j内的字符串为回文串

【c语言】判断一个字符串是不是回文字符串

//判断一个字符串是不是回文字符串 #include <stdio.h> #include <assert.h> int panduan( char *p ) { char *q ; assert( *p != NULL ); q = p; while( *p != '\0') { p++; } p--; while(*q != '\0') { if( *p == *q) { p--; q++; } else return -1; } return 1; } int main()

字符串-判断回文

编程判断一个字符串是否是回文,当字符串是回文时,输出字符串:yes!,否则输出字符串:no!.所谓回文即正向与反的拼向写都一样,如adgda. 长度在100以内,且全为小写字母样例输入:adgda样例输出:yes! 代码如下: 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int main() 6 { 7 char s[100]; 8 cin >> s; 9 int n = s

字符串的回文子序列个数

题目描述 求一个长度不超过15的字符串的回文子序列个数(子序列长度>=1). 输入描述 输入一个长度不超过15的字符串,字符串均由小写字母表示 输出描述 输出其回文子序列个数 样例输入 abaa 样例输出 10 注释 本例中其所有回文子序列为: a,b,a,a,aba,aba,aa,aa,aa,aaa 一个字符串的子序列是指在原字符串上去除某些字符但不破坏余下元素的相对位置(在前或在后)而形成的新字符串. #include<iostream> #include<string>

hdu 6599 I Love Palindrome String 回文自动机

hdu 6599 I Love Palindrome String 回文自动机 当个回文自动机的模板 题意 给一个串S,求长度为i的"特殊回文串"个数,"特殊回文串"要求是回文串,并且自己的一半也是回文串. 思路 求回文串个数相关,优先考虑使用回文自动机,"特殊回文串"要求是回文串,并且自己的一半也是回文串,显然就是fail树扒出来dfs搞一下,记录dfs路径上有没有长度一半的回文串即可. PS:因为fail指针的意义是最长后缀回文,反过来路径显

Hdu 5340 Three Palindromes 最大回文串 Manacher

Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 80    Accepted Submission(s): 21 Problem Description Can we divided a given string S into three nonempty palindromes? Input Fir

HDU 5340——Three Palindromes——————【manacher处理回文串】

Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1244    Accepted Submission(s): 415 Problem Description Can we divided a given string S into three nonempty palindromes? Input F