1、给n个只含0、1的串,求出这些串中前缀的最大和。
例1:
0000
0001
10101
010
结果:6(第1、2串共有000,3+3=6)
例2:
01010010101010101010
11010010101010101010
结果:20(第1串的长度为20)
2、用trie树(字典树)来做,插入的时候统计前缀出现次数,并更新最大前缀和(前缀出现次数*前缀长度)。
3、
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int MAX=2; int ans;//最大前缀和 struct Trie { Trie *next[MAX]; int num[MAX];//此前缀出现次数 }; void createTrie(char *str,Trie *root) { int temp; int len = strlen(str); Trie *p = root, *q; for(int i=0; i<len; ++i) { int id = str[i]-‘0‘; if(p->next[id] == NULL) { q = new Trie; for(int j=0; j<MAX; ++j) { q->next[j] = NULL; q->num[j]=0; } p->next[id] = q; } ++p->num[id];//前缀出现次数+1 temp=p->num[id]*(i+1); if(temp>ans) ans=temp;//更新最大前缀和 p = p->next[id]; } } int main() { char str[205]; int T,n,i; scanf("%d",&T); while(T--) { Trie *root=new Trie; for(i=0; i<MAX; i++) { root->next[i]=NULL; root->num[i]=0; } ans=0;//最大前缀和初始化 scanf("%d",&n); for(i=0; i<n; ++i) { scanf("%s",str); createTrie(str,root);//插入到字典树 } printf("%d\n",ans); } return 0; }
UVA - 11488 Hyper Prefix Sets(trie树)
原文:http://www.cnblogs.com/bofengyu/p/4940692.html