真的不能再拒绝字符串算法的学习,先从Trie树学起吧。。。
COGS 词链,裸题,建出Trie树后遍历一遍,比较根到每个叶子节点的单词个数,取最大值;code:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; struct trie_node{ char letter; int sum; bool f; trie_node *next[26]; trie_node(char letter): letter(letter) {int i;for (i=0;i<=25;++i) next[i]=NULL; f=false; sum=0;} }; trie_node *root; char s[100]; char now[100]; int n,l; void insert(trie_node *p,int i,int len) { trie_node *temp; if (p->next[(int)(s[i])-97]==NULL) { temp=new trie_node(s[i]); p->next[(int)(s[i])-97]=temp; p=p->next[(int)(s[i])-97]; } else p=p->next[(int)(s[i])-97]; if (i==len-1) { p->f=true; p->sum++; return; } insert(p,i+1,len); } void count(trie_node *p) { int i; if (p->f) { for (i=1;i<=l;++i) printf("%c",now[i]); printf("%c ",p->letter); printf("%d\n",p->sum); } for (i=0;i<=25;++i) { if (p->next[i]) { if (p!=root) { l++; now[l]=p->letter; } count(p->next[i]); if (p!=root) l--; } } } int main() { int i,len; root=new trie_node(' '); scanf("%d",&n); for (i=1;i<=n;++i) { scanf("%s",&s); len=strlen(s); insert(root,0,len); } l=0; count(root); }COGS 293 【NOI 2000】单词查找树
15年前的NOI题被各种乱虐,这个题大概可以和数字三角形一起哭死在墙角,code:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct trie_node{ char letter; trie_node *next[26]; trie_node(char letter): letter(letter) {int i; for(i=0;i<=25;++i) next[i]=NULL;} }; int ans=0; trie_node *root; char str[100]; void insert(trie_node *p,int i,int len) { trie_node *temp; if (i==len) return; if (p->next[(int)(str[i])-'A']==NULL) { temp=new trie_node(str[i]); p->next[(int)(str[i])-'A']=temp; p=p->next[(int)(str[i])-'A']; } else p=p->next[(int)(str[i])-'A']; insert(p,i+1,len); } void count(trie_node *p) { bool f; int i; ans++; for (i=0;i<=25;++i) if (p->next[i]!=NULL) count(p->next[i]); } int main() { int len; root=new trie_node(' '); while (scanf("%s",&str)==1) { len=strlen(str); insert(root,0,len); } count(root); printf("%d\n",ans); }COGS 647 【Youdao2010】有道搜索框
一道思路清晰但代码不是特别好写 code:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct trie_node{ char letter; bool f; trie_node *next[26]; trie_node(char letter): letter(letter) {int i;for (i=0;i<=25;++i) next[i]=NULL; f=false;} }; int n,t=0,m,l; trie_node *root; char now[5000]; char str[5000]; void insert(trie_node *p,int i,int len) { trie_node *temp; if (p->next[(int)(str[i])-97]==NULL) { temp=new trie_node(str[i]); p->next[(int)(str[i])-97]=temp; p=p->next[(int)(str[i])-97]; } else p=p->next[(int)(str[i])-97]; if (i==len-1) { p->f=true; return; } insert(p,i+1,len); } bool work(trie_node *p,int i,int len) { if (i==len) return true; if (p->next[(int)(str[i])-97]==NULL) return false; else work(p->next[(int)(str[i])-97],i+1,len); } void out(trie_node *p,int i,int len) { int j; if (i<=len-1) out(p->next[(int)(str[i])-97],i+1,len); if (i>=len) { if (p->f&&t<8) { for (j=0;j<l;++j) cout<<now[j]; if (i!=len) cout<<p->letter; cout<<' '; t++; } for (j=0;j<=25;++j) { if (p->next[j]!=NULL&&t<8) { if (i>len) { now[l]=p->letter; l++; } out(p->next[j],i+1,len); if (i>len) l--; } } } } int main() { int i,len; root=new trie_node(' '); scanf("%d",&n); for (i=1;i<=n;++i) { scanf("%s",&str); len=strlen(str); insert(root,0,len); } scanf("%d",&m); for (i=1;i<=m;++i) { scanf("%s",&str); len=strlen(str); if (!work(root,0,len)) printf("%s\n",str); else {strcpy(now,str); l=len; t=0; out(root,0,len); printf("\n");} } }