1. 程式人生 > >[轉] Manacher演算法詳解

[轉] Manacher演算法詳解

const int maxn=1000010;
char str[maxn];//原字串
char tmp[maxn<<1];//轉換後的字串
int Len[maxn<<1];
//轉換原始串
int INIT(char *st)
{
    int i,len=strlen(st);
    tmp[0]='@';//字串開頭增加一個特殊字元,防止越界
    for(i=1;i<=2*len;i+=2)
    {
        tmp[i]='#';
        tmp[i+1]=st[i/2];
    }
    tmp[2*len+1]='#';
    tmp[
2*len+2]='$';//字串結尾加一個字元,防止越界 tmp[2*len+3]=0; return 2*len+1;//返回轉換字串的長度 } //Manacher演算法計算過程 int MANACHER(char *st,int len) { int mx=0,ans=0,po=0;//mx即為當前計算迴文串最右邊字元的最大值 for(int i=1;i<=len;i++) { if(mx>i) Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取個小 else
Len[i]=1;//如果i>=mx,要從頭開始匹配 while(st[i-Len[i]]==st[i+Len[i]]) Len[i]++; if(Len[i]+i>mx)//若新計算的迴文串右端點位置大於mx,要更新po和mx的值 { mx=Len[i]+i; po=i; } ans=max(ans,Len[i]); } return ans-1;//返回Len[i]中的最大值-1即為原串的最長迴文子串額長度
}

相關推薦

[] Manacher演算法

const int maxn=1000010; char str[maxn];//原字串 char tmp[maxn<<1];//轉換後的字串 int Len[maxn<<1]; //轉換原始串 int INIT(char *st) { int i,len=s

矩陣快速演算法

矩陣的轉置實際上就是將資料元素的行標和列標互換,即 T(i,j) = M(j,i) 。例如: 圖1 矩陣的轉置 相應地,三元組錶轉變為: 圖2 三元組表   總結矩陣的轉置過程,共經歷了三個步驟: 矩陣的行數 n 和列數 m 的值交換; 將三元組中的 i 和 j 調換; 轉換之後的表同

Manacher演算法

Manacher演算法 演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法——kmp和拓展kmp,這次來還是來總結一個字串演算法,manacher演算法,我習慣叫他 “馬拉車”演算法。 相對於前面介紹的兩個演算法,Manacher演算法的應用範圍要狹窄得多,但是它的思想和拓展k

manacher演算法+模板 P3805

  首先我們知道迴文子串的判定和長度的奇偶性是有關係的,由於迴文分為偶迴文(比如 bccb)和奇迴文(比如 bcacb),而在處理奇偶問題上會比較繁瑣,所以這裡我們使用一個技巧,在字元間插入一個字元(前提這個字元未出現在串裡),常用的是"$""#"。舉個例子:s="abbahopxpo",轉換為newS=

最長迴文子串-Manacher演算法()

定義: 迴文串:一個字串, 逆置之後,與原串相同; 迴文子串: 一個字串的子串(連續),是迴文串.則該子串為整個字串的一個迴文子串. 最長迴文子串:一個字串中最長的迴文子串.

hihocoder 1032 最長迴文子串 (Manacher演算法 +模板)

時間限制:1000ms 單點時限:1000ms 記憶體限制:64MB 描述    小Hi和小Ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的

[Network Architecture]DPN(Dual Path Network)演算法()

https://blog.csdn.net/u014380165/article/details/75676216 論文:Dual Path Networks 論文連結:https://arxiv.org/abs/1707.01629 程式碼:https://github.com/cypw/DPN

】【強化學習】Deep Q Network(DQN)演算法

 原文地址:https://blog.csdn.net/qq_30615903/article/details/80744083 DQN(Deep Q-Learning)是將深度學習deeplearning與強化學習reinforcementlearning相結合,實現了從

自知乎-我見過最通俗易懂的KMP演算法

有些演算法,適合從它產生的動機,如何設計與解決問題這樣正向地去介紹。但KMP演算法真的不適合這樣去學。最好的辦法是先搞清楚它所用的資料結構是什麼,再搞清楚怎麼用,最後為什麼的問題就會有恍然大悟的感覺。我試著從這個思路再介

AC 自動機演算法

首先簡要介紹一下AC自動機:Aho-Corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。一個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂AC自動機,先得有模式樹(字典樹)Trie和KMP模式匹配演算法

】機器學習--- 分類演算法

原文連結:http://blog.csdn.net/china1000/article/details/48597469 感覺狼廠有些把機器學習和資料探勘神話了,機器學習、資料探勘的能力其實是有邊界的。機器學習、資料探勘永遠是給大公司的業務錦上添花的

KM演算法+模板()

KM演算法用來求二分圖最大權完美匹配。 本文配合該博文服用更佳:趣寫算法系列之–匈牙利演算法 現在有N男N女,男生和女生每兩個人之間有好感度,我們希望把他們兩兩配對,並且最後希望好感度和最大。 怎麼選擇最優的配對方法呢? 首先,每個妹子會有一

Floyd-Warshall演算法

Floyd-Warshall演算法,簡稱Floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為O(n^3)。我們平時所見的Floyd演算法的一般形式如下: 1 void Floyd(){ 2 int i,j,k; 3 for(k=1;

()js prototype

不同 腳本語言 ava type 部分 load 錯誤 並且 per 轉載自:http://blog.csdn.net/chaojie2009/article/details/6719353 (也是轉載的。鄙視一下此人轉載不著名出處。) 註意:必須帶著懷疑的態度去看這篇文章

()cut命令

控制 分屏顯示 ctrl+ 分隔符 comm 參數 分享圖片 合並 字節 cut 文件內容查看 顯示行中的指定部分,刪除文件中指定字段 顯示文件的內容,類似於下的type命令。 說明 該命令有兩項功能,其一是用來顯示文件的內容,它依次讀取由參數file所指明的文

[]Nginx配置

fast forward type 時間 去除 負載 所有 hash dex Nginx是lgor Sysoev為俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發布至今,憑借開源的力量,已經接近成熟與完善。 Nginx功能豐富,可作為HTTP服務器,也可

()Linux命令-file

版本信息 ref 獲取文件 linux命令 過程 嘗試 file img 文件類型 Linux命令詳解-file 原文:https://www.cnblogs.com/Dodge/p/4278306.html file命令用來識別文件類型,也可用來辨別一些文件的編碼格

()RTSP協議

定義 attach highlight not xtend prev desc 設備 代理服 轉自:https://www.cnblogs.com/lidabo/p/6553212.html RTSP簡介 RTSP(Real Time Streaming Prot

】Vue-設置路由導航的兩種方法: <router-link :to="..."> 和router.push(...)

name app query outer 參數 size 命名 字符 適用於 一、<router-link :to="...">  to裏的值可以是一個字符串路徑,或者一個描述地址的對象。例如: // 字符串 <router-link to="apple

[] xargs命令,xargs與管道的區別

ddd 接受 設計 pad display sof report 程序 at命令 [From] https://www.cnblogs.com/wangqiguo/p/6464234.html 閱讀目錄 為什麽要用xargs,問題的來源 xargs是什麽,與管道有什