zoukankan      html  css  js  c++  java
  • Manacher (最长回文序列)

    https://www.cnblogs.com/grandyang/p/4475985.html

    思路是学习的是上面博客的想法,思路很清晰 优化的方法和exkmp有异曲同工的地方

    博客里的内容我在这里就不重复累赘的叙述了,浪费时间

    我们需要只要关键数组p[]表示位置为i的字符串的半径,并且我们需要记住以下几个性质

    1.最长子串的长度为最长半径减1(用来求长度)

    2.起始位置是中间位置减去半径再除以2(用来求字符串)

    int p[1000007]; //记录半径 
    void manacher(string s){
        string ma="";
        ma+='$';
        ma+='#';
        int len=s.length();
        //预处理字符串 加#是为了让长度变为奇数(避免讨论奇偶)
        //二加$则是为了求字符串的起始位置 在博客中有相关叙述 
        for(int i=0;i<len;i++){
            ma+=s[i];
            ma+='#';
        }
        int po=0; int mx=0; //po记录当前可以延伸到最右端的点 mx为长度 
        len=ma.length();
        for(int i=0;i<len;i++){
            p[i]=mx>i?min(p[2*po-i],mx-i):1; //关键代码 在博客中理解 
            while(ma[i+p[i]]==ma[i-p[i]]) p[i]++;
            if(i+p[i]>mx){ //更新 
                mx=i+p[i];
                po=i;
            }
        }
    }
  • 相关阅读:
    oracle与DB2
    oracle ORA-01427: 单行子查询返回多个行
    mysql开发总结
    mysql show profile基本详解
    mysql批量插入数据
    mysql索引详解
    mysql性能调优
    MySQL优化
    mysql主从调优
    mysql主从复制
  • 原文地址:https://www.cnblogs.com/wmj6/p/10548419.html
Copyright © 2011-2022 走看看