程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 5340-Three Palindromes(Manacher算法)

HDU 5340-Three Palindromes(Manacher算法)

編輯:C++入門知識

HDU 5340-Three Palindromes(Manacher算法)


 
題意:問是否能將字符串str分解為三段非空的回文串。
思路:我們根據Manacher算法對字符串進行處理,處理過程中產生的P數組,我們可以得到兩個數組first和last。
first存儲的是第一個回文串的半徑可能值。
last存儲的是第三個回文串的半徑可能值。
根據first和last我們可以枚舉第一個回文串和第三個回文串,然後根據半徑找出第二個回文串的初始位置和結束位置。然後計算出第二個回文串的中點:
1.如果ll>rr,則第二個字符串的長度為負數,pass
2.如果p[mid]=1,說明第二個回文串為”#”,相當於空,pass
3.如果三個子字符串的長度加起來大於len,證明符合長度,跳出來即可。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#pragma comment(linker, /STACK:102400000,102400000)
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=110010;
char str[maxn];
char s[maxn*2];
int p[maxn*2];
int len;
int first[maxn*2];
int last[maxn*2];
void Manacher()
{
    int i;
    s[0]='$';
    s[1]='#';
    for(i=0;ii)
            p[i]=min(p[2*id-i],p[id]+id-i);
        else
            p[i]=1;
        while(s[i+p[i]]==s[i-p[i]])
            p[i]++;
        if(p[i]+i>p[id]+id) {
            id=i;
        }
        if(p[i]>MaxL)
            MaxL=p[i];
    }
}
int main()
{
    int T;
    scanf(%d,&T);
    while(T--){
        scanf(%s,&str);
        len=strlen(str);
        Manacher();
        int l1=0,r1=0;
        for(int i=2;i<=len-2;i++){
            if(i==p[i])
                first[l1++]=i;
            if(p[i]==len-i)
                last[r1++]=i;
        }
        int flag=0;
        int ll,rr,mid;
        for(int i=0;irr)
                    continue;
                mid=(ll+rr)/2;
                if(ll==rr&&s[mid]=='#')
                    continue;
                if(p[first[i]]*2-1+p[mid]*2-1+p[last[j]]*2-1>=len+1){
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            puts(Yes);
        else
            puts(No);
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved