1. 程式人生 > >poj_1974,最長迴文字串manacher

poj_1974,最長迴文字串manacher

時間複雜度為O(n),參考:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2001000
using namespace std;
char s[maxn],st[maxn];
int p[maxn];
int cases=1;
int n;
void rebuild()
{
    st[0]='$';
    st[1]='#';
    int len=strlen(s);
    for(int i=0;i<len;i++)
        {st[2*i+2]=s[i];st[2*i+3]='#';}
    st[2*len+2]=0;
}
void solve()
{
    int len=2*strlen(s)+2;
    int id,mx=0,ans=1;
    for(int i=0;i<len;i++)
    {
        if(mx>i)
            p[i]=min(p[2*id-i],mx-i);
        else
            p[i]=1;
        for(;st[p[i]+i]==st[i-p[i]];p[i]++)
            ;
        if(p[i]+i>mx)
        {
            mx=p[i]+i;
            id=i;
        }
        ans=max(ans,p[i]);
    }
    cout<<"Case "<<cases++<<": "<<ans-1<<endl;
}
int main()
{
    while(gets(s))
    {
        if(s[0]=='E'&&s[1]=='N'&&s[2]=='D') break;
        rebuild();
        solve();
    }
    return 0;
}

相關推薦

poj_1974字串manacher

時間複雜度為O(n),參考:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474#include<iostream> #inc

字串--MANACHER演算法

個人感覺馬拉車演算法的思想和擴充套件KMP的思想是相似的。 首先對於這個問題,我們可以暴力列舉每個子串,然後判斷是否是迴文串,時間複雜度大概是O(n^3),我們運用下尺取法的思想,列舉每一個對稱軸位置(針對長度的奇偶有所區別),那麼時間複雜度會是O(n^2),接著我們如果把

Manacher演算法:求解字串時間複雜度為O(N)

迴文串定義:“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。迴文子串,顧名思義,即字串中滿足迴文性質的子串。 經常有一些題目圍繞回文子串進行討論,比如POJ3974最長迴文,求最長迴文子串的長度。樸素演算法是依次以每一個字元為中心

【HDU - 3068】Manacher演算法馬拉車演算法求子串)

題幹: 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩

字串演算法-Manacher’s Algorithm-馬拉車演算法

除了翻譯之外,其中還加入了個人的理解的部分,將其中沒有詳細說明的部分進行了解釋。 時間複雜度為O(n)的演算法 首先,我們需要講輸入的字串 S 進行一下轉換得到 T,轉換的方法就是通過在每兩個字元之間插入一個字串“#”,你馬上就能知道為什麼要這麼做。

] 找工作知識儲備(2)---陣列字串那些經典演算法:大子序列和遞增子序列公共子串公共子序列字串編輯距離不重複子串子串

作者:寒小陽 時間:2013年9月。 0、前言         這一部分的內容原本是打算在之後的字串或者陣列專題裡面寫的,但看著目前火熱進行的各家網際網路公司筆試面試中,出現了其中的一兩個內容,就隨即將這些經典問題整理整理,單寫一

java manacher演算法計算字串

求解最長迴文字串樸素演算法 最樸素的演算法是暴力解法就不談了,時間複雜度是O(n3)。 比最樸素解法稍微好一些的解法是O(n2)的一種解法,思路是從對稱軸開始考慮,根據迴文字串長度的奇偶分為兩種情況,如果最長的迴文字串為偶數位,那麼他的對稱軸是中間部分,

Manacher演算法時間複雜度O(n)

最長迴文子串 問題 對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。 給定字串A以及它的長度n,請返回最長迴文子串的長度。 測試樣例: “abc1234321ab”,12 返回:7 中心擴充套件到Manache

LeetCode 字串檢測

寫了兩個方法,一個7000ms多一個5000ms多,比較菜,看了最厲害的50ms的程式碼,直接寫幾萬個字串做字典查詢,學不來學不來。。。。。。 import numpy as np class Solution: def longestPalindrome2(self, s):

轉載-----Java Longest Palindromic Substring(字串)

轉載地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假設一個字串從左向右寫和從右向左寫是一樣的,這種字串就叫做palindromic string。如aba,或者abba。本題是這種,給定輸入一個字串。要求輸出一個子串,使得子串是最長的padromi

leetcode-中級演算法-陣列和字串-字串

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 思路 這道題很顯然可以用暴力求解,但時

求出 字串 JAVA版本【給出編碼思想-適用於任何語言】

目的:在任意的字串中求出最長的迴文字串   思路:(適用於任何語言)   1、判斷當前給定的字串是否是相同的字串(也就是所有字元都相同),如果是直接返回了。   2、如果第一步沒有返回,就以非第一個字元為軸,分別求出以它為軸的,雙數迴文字串,

PAT (Advanced Level) Practice 1040 Longest Symmetric String (25 分) 字串 dp

#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=

Python求字串(三重迴圈遍歷所有字串 新)

前兩天自己寫了下,雖然對了,但是思路不太好,網上看了遍歷的思路,瞬間感覺之前好蠢,雖然本質上我的程式碼也是遍歷,但是思路不好。 正確思路就是先遍歷出所有長度大於等於2的字串,然後在逐一判斷這些字串是不是迴文字串就行了,思路清晰了,程式碼就簡單多了,10分鐘就寫完了。 d

C語言實現求一個字串字串 動態規劃

求解思路: 迴文字串的子串也是迴文,比如P[i,j](表示以i開始以j結束的子串)是迴文字串, 那麼P[i+1,j-1]也是迴文字串。這樣最長迴文子串就能分解成一系列子問題了。 這樣需要額外的空間O(

串-manacher演算法模板

給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩組case之間由

LeetCode:Longest Palindromic Substring(字串)

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "b

409

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: "abccccdd" 輸出: 7 解釋: 我們可以

leetcode第五題—字串

string longestPalindrome(string &s) { int n=s.size(); if(n==0) return " "; string longest=s.substr(0,1); for(int i=0;i<n-1;i++) { //cente

字串-Java實現

一、問題描述 迴文字串定義:如果一個字串正著讀和反著讀是一樣的,那它就是迴文串例如:aba 、 abcba 。  要求:  給出一個字串:asdsaasa  返回一個最長的迴文字串:asdsa 二、解法(迴文字串為奇數) public class Test {