http://acm.hdu.edu.cn/showproblem.php?pid=2072
这个题我是用的字典树的方法来做的,首先一个字母一个字母判断,没有则创建,有则直接进入这一层。同时到单词结束时进行判断是否以前出现过。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int sum; //不同单词的总数 char s[100000]; char st[500]; struct node { int n; //用于标记从根到这里的单词出现的次数 node *next[26]; }; node root; void tree(char *s, int len) { int i,j,id; node *p,*q; p = &root; for(i = 0; i<len; i++) { id = s[i]-'a'; if(p->next[id]==NULL) //如果为空,则创建树,否则进入 { q=(node *)malloc(sizeof(node)); q->n = 0; for(j = 0; j<26; j++) { q->next[j] = NULL; } p->next[id] = q; p=p->next[id]; } else { p = p->next[id]; } } if(p->n==0)//如果这个单词没有出现过,则总数加一 { sum++; p->n++; } else { p->n++; } return ; } int main() { int n,i,j; while(1) { sum = 0; gets(s); if(s[0]=='#') { break; } n = strlen(s); for(i = 0; i < 26; i++) //初始化树 { root.n = 1; root.next[i] = NULL; } j = 0; for(i = 0; i < n; i++) { if(s[i]==' ') //用空格隔开,取出每个单词 { tree(st,j); j = 0; } else { st[j] = s[i]; j++; } } /*if(s[n-1]!=' ') { tree(st,j); }*/ tree(st,j); printf("%d\n",sum); } return 0; }
作者:wqc359782004 发表于2013-9-13 9:28:11 原文链接
阅读:37 评论:0 查看评论