BZOJ1174 [Balkan2007] Toponyms 邻接链表优化 TRIE树

大家都吼强,可与之共勉嗯嗯。

题意:
  给您一个字符集合,你从其中找出一些字符串出来。 希望你找出来的这些字符串的最长公共前缀 × 字符串的总个数最大化。

  空格也是嗯,所以我看不懂样例!!!!!!!!

题解:
  傻逼题,哎呀MLE了。怎么办,那就暴力找转移叭!!!
  我们发现转移 go[cur][26] 并不是 26 个都用上了(又不是补全AC自动机),于是我萌就可以用链表存转移边。
  A掉惹!!!

/************************************************************** Problem: 1174 User: Lazer2001 Language: C++ Result: Accepted Time:4716 ms Memory:98944 kb ****************************************************************/

# include <bits/stdc++.h>

# define N 5000010

struct edge  {
    char c ; int to, nxt ;  
} g [N] ;

int cnt [N], ncnt ;
int head [N], ecnt ;

# undef N

long long ans ( 0 ) ;

inline void insert ( )  {
    int cur ( 0 ) ;
    register int c ;
    while ( isspace ( c = getchar ( ) ) ) ;
    for ( int i = 1 ; c != '\n' ; ++ i, c = getchar ( ) )  {
        int nxt = -1 ;
        for ( int it = head [cur] ; it ; it = g [it].nxt )
            if ( g [it].c == c )  {
                nxt = g [it].to ;
                break ;
            }
        if ( nxt == -1 )  {
            ++ ecnt ;
            g [ecnt].c = c, g [ecnt].to = ( nxt = ++ ncnt ), g [ecnt].nxt = head [cur] ;  head [cur] = ecnt ;
        }
        cur = nxt ;
        ++ cnt [cur] ;
        ans = std :: max ( ans, 1LL * ( cnt [cur] ) * i ) ;
    }
}

int main ( )  {
    int n ;
    scanf ( "%d", & n ) ;
    while ( n -- )  {
        insert ( ) ;
    }
    printf ( "%lld\n", ans ) ;
    return 0 ;
}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/simpsonk/article/details/78775565
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞