1. 程式人生 > >Manacher【SP7586】NUMOFPAL - Number of Palindromes

Manacher【SP7586】NUMOFPAL - Number of Palindromes

for output std 一位 lin string lse 添加 cstring

Description

求一個串中包含幾個回文串。

Input

輸入一個字符串\(S\)

Output

包含的回文串的個數.

看到題解裏面有人人寫回文自動機.

有必要那麽麻煩嘛 emmm

我們直接跑\(Manacher\)就好了啊.

答案就是以每一位為中心的回文串長度/2的和。

(如果添加字符則為回文半徑長度/2。)

這個就不多解釋了.很明顯的一個東西。

不能理解的話,可以看下這個

# a # a # b # a # a #

1 2 3 2 1 6 1 2 3 2 1

數字對應於每一個位置的回文半徑

.(實際上減去\(1\)才是,但是計算的時候要加上1,所以代碼裏面直接用了這個.)

代碼

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define R register

using namespace std;

const int maxn=1008;

char ch[maxn];
char s[maxn<<2];
int len,RL[maxn<<2],MaxRight,center,ans;
int main()
{
    scanf("%s",ch);
    len=strlen(ch);
    for(R int i=0;i<len;i++)s[2*i+1]=ch[i];
    len=2*len+1;
    for(R int i=0;i<len;i++)
    {
        if(i<=MaxRight)
            RL[i]=min(RL[2*center-i],MaxRight-i);
        else RL[i]=1;
        while(s[i-RL[i]]==s[i+RL[i]] and i-RL[i]>=0 and i+RL[i]<len)
            RL[i]++;
        if(i+RL[i]-1>MaxRight)
            MaxRight=i+RL[i]-1,center=i;
    }
    for(R int i=0;i<len;i++)ans+=RL[i]/2;
    printf("%d",ans);
}

Manacher【SP7586】NUMOFPAL - Number of Palindromes