#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
using namespace std;
/*
manacher algrithm
(1)插入与原串不冲突的字符,使新串不存在长度为偶数的回文串
(2)一个以x为中心,半径为10的回文串,其左半部的某个中点(如x-5)与右半边某个中点(如x+5)的回文串存在相似性。
*/
struct MANACHER{
#define STRSIZE 1010000
char str[STRSIZE*2+5];
int radius[STRSIZE*2+5];
int str_len;
MANACHER(){}
MANACHER(char *tar){solver(tar);}
int solver(char *tar); //执行MANACHER算法
int getMaxPalSize(); //最长回文串长度
long long getPalNum(); //不同回文串个数
};
int MANACHER::solver(char *tar){
//(1)construct new string
int tar_len=strlen(tar);
str_len=tar_len*2+2;
str[0]='~';
str[1]='!';
for (int i=0;i<tar_len;i++){
str[i*2+2]=tar[i];
str[i*2+3]='!';
}
str[str_len]=0;
//(2)calculate radius
int max_i
[ACM模板]manacher算法(回文串统计)
最新推荐文章于 2022-08-01 22:09:43 发布
本文介绍了Manacher算法,一种用于寻找字符串中回文子串的高效算法。通过构造新字符串并计算回文半径,该算法可以避免不必要的重复比较,从而在O(n)时间内找到最长回文串的长度和不同回文串的数量。
摘要由CSDN通过智能技术生成