暂无链接
唉,还是当时太紧张了,这么一水题当时嗯是没敲对,下来直接1A了,泪奔啊
字典树方法:插入的时候每个节点遇到一次便+1,查询的时候每遇到一个节点便-1,如果该节点值==0则不必再往下查询了,最后一个字符串不用查询
#include<cstdio>
#include<cstring>
#define MAXN 100005
struct node
{
int ch[MAXN][26],val[MAXN];
int sz;
void ini(){sz=1;memset(ch[0],0,sizeof(ch[0]));}
int idx(char c){return c-'a';}
void insert(char *s)
{
int pre=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int next=idx(s[i]);
if(!ch[pre][next])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[pre][next]=sz++;
}
val[ch[pre][next]]++;
pre=ch[pre][next];
}
}
int cnt;
void query(char *s)
{
cnt=0;
int pre=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int next=idx(s[i]);
cnt++;
val[ch[pre][next]]--;
if(val[ch[pre][next]]==0)
return ;
pre=ch[pre][next];
}
}
};
char s[1000][MAXN];//如果数据有10^5个长度为1的字符串就不行了,可以用vector,map之类的
node a;
int main()
{
int n,ans,i;
while(scanf("%d",&n)!=EOF)
{
ans=0;
a.ini();
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
a.insert(s[i]);
}
for(i=0;i<n-1;i++)
{
a.query(s[i]);
ans+=a.cnt;
}
printf("%.6lf\n",ans*1.0);
}
return 0;
}