uestc Caruta (字典树)

来源:互联网 发布:植物名称查询软件 编辑:程序博客网 时间:2024/06/06 14:53

暂无链接


唉,还是当时太紧张了,这么一水题当时嗯是没敲对,下来直接1A了,泪奔啊

字典树方法:插入的时候每个节点遇到一次便+1,查询的时候每遇到一个节点便-1,如果该节点值==0则不必再往下查询了,最后一个字符串不用查询


#include<cstdio>#include<cstring>#define MAXN 100005struct 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;}


0 0
原创粉丝点击