(trie) UVA - 11732 "strcmp()" Anyone?
将所有的字符串一起依次建立trie树。
在每一次insert的过程中更新答案。每次insert,每走到一个结点(包括根结点)时,一定会与该结点的所有子结点比较一次,之后按照改字符串的字符,走到下一个结点,只与之前也走到该结点的字符串发生第2次比较。其他先前父节点的子结点的字符串,都因为那一次比较就已经出现不同而结束了比较。重复该过程。到最后的叶子结点时循环已经结束,但是注意还需要再加上必定发生的“第二次比较”。
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 #include <queue> 8 #include <set> 9 #include <map> 10 #include <list> 11 #include <vector> 12 #include <stack> 13 #define mp make_pair 14 #define MIN(a,b) (a>b?b:a) 15 #define rank rankk 16 //#define MAX(a,b) (a>b?a:b) 17 typedef long long ll; 18 typedef unsigned long long ull; 19 const int MAX=1e5+5; 20 const int INF=1e9+5; 21 const int B=1024;//桶的大小 22 const double M=4e18; 23 const int MAX_NODE=4e6+5; 24 const int sigma_size=80; 25 using namespace std; 26 const int MOD=1e9+7; 27 typedef pair<int,int> pii; 28 const double eps=0.000000001; 29 ll an; 30 struct Trie 31 { 32 int ch[MAX_NODE][sigma_size]; 33 int val[MAX_NODE]; 34 int num; 35 Trie(){num=1;memset(ch[0],0,sizeof(ch[0]));memset(val,0,sizeof(val));} 36 int idx(char c) 37 { 38 // char oh='\0'; 39 if(c=='\0') 40 return 0; 41 else 42 return c-'0'+1; 43 } 44 void clear(){num=1;memset(ch[0],0,sizeof(ch[0]));memset(val,0,sizeof(val));} 45 void insert(char *x,int v) 46 { 47 int u=0,len=strlen(x); 48 // x[len]='\0'; 49 ++len; 50 for(int i=0;i<len;i++) 51 { 52 // printf("%d %d\n",i,val[u]); 53 an+=val[u]; 54 if(i) 55 an+=val[u]; 56 ++val[u]; 57 int to=idx(x[i]); 58 if(!ch[u][to]) 59 { 60 memset(ch[num],0,sizeof(ch[num])); 61 val[num]=0; 62 ch[u][to]=num++; 63 } 64 u=ch[u][to]; 65 } 66 if(len) 67 an+=val[u]; 68 ++val[u]; 69 } 70 }; 71 Trie dic; 72 int n; 73 char tem[MAX]; 74 int cnt=0; 75 int main() 76 { 77 // freopen("in.txt","r",stdin); 78 // freopen("out.txt","w",stdout); 79 while(scanf("%d",&n)&&n) 80 { 81 an=0LL; 82 dic.clear(); 83 for(int i=0;i<n;i++) 84 { 85 scanf("%s",tem); 86 // if(cnt==94) 87 // printf("%s\n",tem); 88 dic.insert(tem,1); 89 } 90 // ++cnt; 91 printf("Case %d: %lld\n",++cnt,an); 92 } 93 return 0; 94 }