|
本帖最后由 wuyvzhang 于 2016-8-2 17:24 编辑
题意:给你n个串,对于一个前缀,如果出现k次,就会得到前缀的长度*k,现在让你求长度*k的最大值。
题解:用trie树来搞。把每个串插入到trie中,记录每个子串出现的次数以及长度,trie树很容易实现,然后插完之后,把每个节点遍历一遍,求最大的len*sum,输出即可。
1 #include
2 #include
3 #include
4 using namespace std;
5 const int maxnode = 4000 * 1000 + 10;
6 const int sigma_size = 26;
7 char word[10002];
8 int n,m;
9 int sz;
10 struct Trie {
11 int head[maxnode]; // head为第i个结点的左儿子编号
12 int next[maxnode]; // next为第i个结点的右兄弟编号
13 char ch[maxnode]; // ch为第i个结点上的字符
14 int sum[maxnode];
15 int len[maxnode];
16 void clear() {
17 sz = 1;
18 head[0] = next[0] = 0;
19 memset(len,0,sizeof(len));
20 memset(sum,0,sizeof(sum));
21 }
22 void insert(const char *s,int form ,int to) {
23 int u = 0, v;
24 for(int i = form; i
SO娱乐城:真_人.足球.彩票齐全| 开户送10元.首存送58元.手机可投i注任何游戏顶级信用i提现即时到账SO.CC |
|
|