zoukankan      html  css  js  c++  java
  • ural 1297 最长回文串 manacher 算法

    算法内容 http://blog.sina.com.cn/s/blog_70811e1a01014esn.html

    题目直接看输出即可, 注意前后放 ? #, #*. 然后找最大回文串长度应该是 rid[i]*2 + (str[i] =='#')

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<string>
    using namespace std;
    
    const int N = 1024;
    
    char s[N];
    int rid[N<<2];
    string t;
    void init(){
        int len = strlen(s);
        t += '?';
        for(int i = 0; i < len; i++){
            t += '#';
            t += s[i];
        }
        t += "#*";
    }
    void GetRid(){
        int i = 1;
        for(int i=1,j=0,k,End=(int)t.size(); i < End-1; ){
            while( t[i-j-1] == t[i+j+1] ) j++;
            rid[i] = j;
            for(k = 1; k<=j && rid[i-k]!=rid[i]-k; k++)
                rid[i+k] = min( rid[i-k], rid[i]-k );
            i += k;
            j = max( j-k, 0 );
        }
    }
    int main(){
        
        scanf("%s", s );
        init();    
        GetRid();
            
        int len = (int)t.size();
        int m = 0, pos = -1;
        for(int i = 1; i < len-1; i++){
            if( m < (rid[i]*2+(t[i]!='#')) ){
                m = (rid[i]*2+(t[i]!='#')), pos = i;    
            }    
        }
        string ans;
        for(int i = pos-rid[pos]; i < pos+rid[pos]; i++){
            if( t[i] != '#' ) ans += t[i];    
        }
        printf("%s\n", ans.c_str() );
    //    for(int i = 0; i < len; i++){
    //        printf("%c ", t[i]);    
    //    }puts("");
    //    for(int i = 0; i < len; i++)
    //        printf("%d ", rid[i] );    
    //    puts("");    
        return 0; }
    View Code
  • 相关阅读:
    codeforces round#600
    第三章:数据操作
    1143 Lowest Common Ancestor (30 分)
    游标
    1151 LCA in a Binary Tree (30 分)
    jQuery之setInterval()定时器
    C程序第四次作业
    C程序第三次作业
    C程序第二次作业
    C程序第一次作业
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/3088301.html
Copyright © 2011-2022 走看看