【POJ】1509 Glass Beads 【后缀自动机】

来源:互联网 发布:宝玛中走丝是什么软件 编辑:程序博客网 时间:2024/05/22 06:32

传送门:【POJ】1509 Glass Beads


my code:

#include <stdio.h>#include <string.h>#include <set>#include <algorithm>using namespace std ;typedef long long LL ;typedef unsigned long long ULL ;typedef pair < int , int > pii ;#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 = 40005 ;const int W = 26 ;struct Node {Node* next[W] ;Node* fail ;int len ;int l ;void newnode () {clr ( next , 0 ) ;fail = NULL ;len = l = 0 ;}} ;typedef Node* P_Node ;struct SAM {Node node[MAXN] ;P_Node last , root ;int cnt ;void init () {cnt = 0 ;node->newnode () ;root = last = node ;}void add ( int c ) {P_Node p = last , np = node + ( ++ cnt ) ;np->newnode () ;np->l = np->len = p->len + 1 ;last = np ;for ( ; p && !p->next[c] ; p = p->fail ) p->next[c] = np ;if ( !p ) np->fail = root ;else {if ( p->len + 1 == p->next[c]->len ) np->fail = p->next[c] ;else {P_Node q = p->next[c] , nq = node + ( ++ cnt ) ;*nq = *q ;nq->len = p->len + 1 ;nq->l = np->len ;q->fail = np->fail = nq ;for ( ; p && p->next[c] == q ; p = p->fail ) p->next[c] = nq ;}}}} ;SAM sam ;char s[MAXN] ;int n ;void solve () {sam.init () ;scanf ( "%s" , s ) ;n = strlen ( s ) ;rep ( i , 0 , n ) sam.add ( s[i] - 'a' ) ;rep ( i , 0 , n ) sam.add ( s[i] - 'a' ) ;P_Node now = sam.root ;rep ( i , 0 , n ) {rep ( j , 0 , W ) if ( now->next[j] ) {now = now->next[j] ;break ;}}printf ( "%d\n" , now->l - n + 1 ) ;}int main () {int T ;scanf ( "%d" , &T ) ;For ( i , 1 , T ) solve () ;return 0 ;}


0 0
原创粉丝点击