额,不知道为什么在搜其他题的时候发现了这题
既然也是trie那就做掉把
就是建一颗trie然后打几个标机好了
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,sz=1,ans;
string ch;
int a[500003][53];//这就是个trie
int the_num[500003];//用以当前公共前缀的单词个数
void insert(){
int l=ch.length(),now=0;
for(int i=0;i<l;i++){
int t;
if(ch[i]==' '){
t=52;
}else{
if(ch[i]<='Z'){
t=ch[i]-'A';
}else{
t=ch[i]-'a'+26;
}
}//计算此字符的编号
if(a[now][t]>0){
now=a[now][t];//如果已经有节点了,直接往那么节点走
}else{
now=a[now][t]=++sz;//既然还没有这种节点直接新加节点
}
the_num[now]++;//当前公共前缀的单词个数
ans=max(ans,the_num[now]*(i+1));//算答案公共前缀的单词个数*单词数
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
getline(cin,ch);
insert();//读入,然后插入并计算单胺
}
cout<<ans<<endl;
return 0;
}
/*
in:
7
Jora de Sus
Orhei
Jora de Mijloc
Joreni
Jora de Jos
Japca
Orheiul Vechi
out:
24
*/