LightOJ1224
本题题意是让你找出一个字符串,使该字符串作为前缀的次数
∗
∗
该字符串的长度结果最大
我们首先构建好trie树,我们利用记录节点出现次数的方式存储,这时候结果就是,对于当前的len也就是递归深度,如果我们要存入所有节点之后再重新扫一遍Trie树复杂度会高很多,所以我们可以在插入字符串的时候进行统计,用一个maxx保存
sum[root]∗当前len
s
u
m
[
r
o
o
t
]
∗
当
前
l
e
n
的最大值就好了.具体实现看代码。
LightOJ1224代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
const int maxn =2e6+5;
int tree[maxn][5];//只有四种字符
int sum[maxn];
int tot;
int ans;
map<char,int> mm;//字符映射
void insert_(char *str)
{
int len=strlen(str);
int root=0;
for(int i=0;i<len;i++)
{
int id=mm[str[i]];
if(!tree[root][id]) tree[root][id]=++tot;
sum[tree[root][id]]++;
ans=max(ans,sum[tree[root][id]]*(i+1));//插入时直接统计结果
root=tree[root][id];
}
}
char ss[55];
int main()
{
mm['A']=0;
mm['C']=1;
mm['G']=2;
mm['T']=3;
int t,n;
scanf("%d",&t);
int cnt=1;
while(t--)
{
ans=0;
scanf("%d",&n);
while(n--)
{
scanf("%s",ss);
insert_(ss);
}
for(int i=0;i<=tot;i++)
{
sum[i]=0;
for(int j=0;j<4;j++)
tree[i][j]=0;
}
tot=0;
printf("Case %d: %d\n",cnt++,ans);
}
return 0;
}