这题印象深刻,我刚接触acm时,以为这题是水题(因为是中文,又短),一直没做出。现再想想也是。可能也是我以前字符串掌握不好;
这题其实也可以用stl里的map写。这里我用字典树写的。其实这题算简单题了吧。
#include<stdio.h> #include<string.h> #include<stdlib.h> struct trie { trie *next[26]; int flag;//flag标记这里是否一个单词结束,也就是说到这里是否有一个单词; }; trie *root; void init() { int i; root=(trie*)malloc(sizeof(trie)); for(i=0;i<26;i++) { root->next[i]=NULL; } root->flag=0; } void insert(char *str) { trie *p=root,*q; int i,j,len=strlen(str); for(i=0;i<len;i++) { int id=str[i]-‘a‘; if(p->next[id]==NULL) { q=(trie*)malloc(sizeof(trie)); for(j=0;j<26;j++) q->next[j]=NULL; q->flag=0; p->next[id]=q; } p=p->next[id]; if(i==len-1) p->flag=1; } } int query(char *str) { int i,len=strlen(str); trie *p=root; for(i=0;i<len;i++) { int id=str[i]-‘a‘; if(p->next[id]==NULL) return 1; else { p=p->next[id]; } } if(p->flag==1) return 0; return 1; } int main() { int i,j,ans; char str[1000],s[100]; while(gets(str)) { ans=0; init(); if(str[0]==‘#‘)break; int len=strlen(str); int num; for(i=0;i<len;i++) { num=0; for(j=i;j<len;j++) { if(str[j]==‘ ‘) break; s[num++]=str[j];//读取单词 } i=j; s[num]=‘\0‘; //printf("%s ",s); if(strcmp(s,"")!=0&&query(s))//前面strcmp主要为了防止空格 { insert(s); ans++; } } printf("%d\n",ans); } }
时间: 2024-11-13 10:19:03