• hdu5340 Three Palindromes(manacher算法)


    题目描写叙述:

    推断能否将字符串S分成三段非空回文串。

    解题思路:



    源码:

    #include <cstdio>
    #include <algorithm>
    #define MAXN 20010
    using namespace std;
    
    int n;
    char d[MAXN];///原始字符串
    char st[MAXN*2];///经过manacher处理之后的字符串
    int p[MAXN*2];///保存回文串半径,ps每一个回文串长度一定为奇数
    
    int ll[MAXN*2];///第一个回文串可能的全部半径
    int rr[MAXN*2];///第三个回文串可能的全部半径
    
    void manacher(){///manacher算法,能够去查询了解一下
        int i;
        st[0]='$';
        st[1]='#';
        for(i=1;d[i]!='';++i){
            st[i*2]=d[i];
            st[i*2+1]='#';
        }
        st[i*2]='';
        n=i*2-1;
        int MaxId=0,id;
        for(int i=1;i<=n;i++)
        {
            if(MaxId>i)
                p[i]=min(p[2*id-i],MaxId-i);
            else
                p[i]=1;
            while(st[i+p[i]]==st[i-p[i]])
                p[i]++;
            if(p[i]+i>MaxId){
                id=i;
                MaxId=p[i]+i;
            }
        }
    }
    
    int main(){
        int res;
        scanf("%d",&res);
        while(res--){
            scanf("%s",&d[1]);
            manacher();
            int l=0,r=0;
            for(int i=1;i<=n;i++){
                if(p[i]==i&&i!=1)///p[i]==i保证p[i]能够作为第一个回文串的半径,增加ll数组,i!=1保证第一个回文串不为空
                    ll[l++]=p[i];
                if(p[i]+i-1==n&&i!=n)///与上面相似
                    rr[r++]=p[i];
            }
            int i,j;
            for(i=l-1;i>=0;--i){
                for(j=0;j<=r-1;++j){///枚举第一个回文串和第三个回文串
                    int tl=2*ll[i];///第二个字符串的開始位置
                    int tr=n+1-2*rr[j];///第二个字符串的结束位置
                    int tmp=(tl+tr)/2;///第二个字符串的中间位置,ps:这三个字符串都为奇数,能够自己想想
                    if(tl>tr) continue;
                    if(p[tmp]==1) continue;///第二个字符串为"#",也即是在原串中为空
                    if(p[tmp]*2-1>=tr-tl+1)///以tmp为中点的回文串的长度大于等于第二个字符串的长度,符合题意跳出循环
                        break;
                }
                if(j<=r-1)
                    break;
            }
            if(i>=0)
                printf("Yes
    ");
            else
                printf("No
    ");
        }
        return 0;
    }
    






  • 相关阅读:
    java爬虫系列目录
    java爬虫系列第五讲-如何使用代理防止爬虫被屏蔽?
    java爬虫系列第三讲-获取页面中绝对路径的各种方法
    java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
    java爬虫系列第一讲-爬虫入门
    spring aop中pointcut表达式完整版
    wkhtmltox实现网页转换成图片或pdf
    spring通知执行的顺序
    nginx代理(正向代理和反向代理)
    nginx热加载、热升级、回滚
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7218124.html
Copyright © 2020-2023  润新知