8.10 trie树模板
字典树是一种很简单的数据结构,就是将字符串存在书上,相同前缀进行压缩
模板题:http://acm.hdu.edu.cn/showproblem.php?pid=1251
#include<bits/stdc++.h> #define fi first #define se second #define rep( i ,x ,y ) for( int i= x; i<= y ;i++ ) #define reb( i ,y ,x ) for( int i= y; i>= x ;i-- ) #define mem( a ,x ) memset( a ,x ,sizeof(a)) using namespace std; const int maxn = 500000; char s[100] ; int trie[maxn][30] ,sum[maxn]; int tot = 0; //更新 void updata( ){ int len = strlen( s ); int root = 0; for( int i = 0 ;i<len ;i++){ int id = s[i] - 'a'; if( !trie[root][id] )trie[root][id] = ++tot; root = trie[root][id]; sum[root]++; } } //查找 int find( ){ int len = strlen( s ); int root = 0; for( int i = 0; i < len ;i++ ){ int x = s[i] - 'a'; //cout<<s[i]<<endl; if( !trie[root][x] )return 0; root = trie[root][x]; // cout<<root<<endl; } return sum[root]; } int main( ){ mem( trie , 0 ); mem( sum ,0 ); while( 1 ){ gets( s ); if( s[0] == '\0' )break; updata( ); } while( ~scanf("%s" ,&s) ){ printf("%d\n" ,find( ) ); } return 0; }