zoukankan      html  css  js  c++  java
  • 【Tsinsen】A1280. 最长双回文串

    Bryce1010模板

    http://www.tsinsen.com/A1280###

    这里写图片描述

    题目分析:记录一个点向后和向前的最长回文串,然后就是max(Llen[i]+Rlen[i+1])了。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std ;
    typedef long long LL ;
    #define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
    #define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
    #define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
    #define clr( a , x ) memset ( a , x , sizeof a )
    const int MAXN = 100005 ;
    const int N = 26 ;
    
    struct Palindromic_Tree {
        int next[MAXN][N] ;
        int fail[MAXN] ;
        int cnt[MAXN] ;
        int len[MAXN] ;
        int S[MAXN] ;
        int last ;
        int n ;
        int p ;
    
        int newnode ( int l ) {
            for ( int i = 0 ; i < N ; ++ i ) next[p][i] = 0 ;
            cnt[p] = 0 ;
            len[p] = l ;
            return p ++ ;
        }
    
        void init () {
            p = 0 ;
            newnode (  0 ) ;
            newnode ( -1 ) ;
            last = 0 ;
            n = 0 ;
            S[n] = -1 ;
            fail[0] = 1 ;
        }
    
        int get_fail ( int x ) {
            while ( S[n - len[x] - 1] != S[n] ) x = fail[x] ;
            return x ;
        }
    
        int add ( int c ) {
            c -= 'a' ;
            S[++ n] = c ;
            int cur = get_fail ( last ) ;
            if ( !next[cur][c] ) {
                int now = newnode ( len[cur] + 2 ) ;
                fail[now] = next[get_fail ( fail[cur] )][c] ;
                next[cur][c] = now ;
            }
            last = next[cur][c] ;
            cnt[last] ++ ;
            return len[last] ;
        }
    
        void count () {
            for ( int i = p - 1 ; i >= 0 ; -- i ) cnt[fail[i]] += cnt[i] ;
        }
    } ;
    
    Palindromic_Tree T ;
    int n ;
    int len[MAXN] ;
    char s[MAXN] ;
    
    void solve () {
        int ans = 0 ;
        n = strlen ( s ) ;
        T.init () ;
        for ( int i = n - 1 ; i >= 0 ; -- i ) {
            len[i] = T.add ( s[i] ) ;
        }
        T.init () ;
        for ( int i = 0 ; i < n - 1 ; ++ i ) {
            ans = max ( ans , T.add ( s[i] ) + len[i + 1] ) ;
        }
        printf ( "%d
    " , ans ) ;
    }
    
    int main () {
        while ( ~scanf ( "%s" , s ) ) solve () ;
        return 0 ;
    }
    
  • 相关阅读:
    线程的用法
    提高VS2010的性能,VS2010不再卡
    win7 远程桌面最大化快捷键
    java类加载器
    Class类
    JDBC获得oracle数据库主键值
    Zookeeper入门基础知识
    项目js总结
    jdk8 stream项目使用
    全局请求参数去除空格
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386880.html
Copyright © 2011-2022 走看看