Manacher【SP7586】NUMOFPAL - Number of Palindromes
阿新 • • 發佈:2018-10-30
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