这道题很明显的字典树...边输入边建树..在每个单词的末尾字符标记单词...题目最终要按字典序输出某一频率的单词..那么就DFS一次树..结果就出来了..注意的细节是..:
1.单词一律转化为全小写..其实这个在样例里也有体现..In 和 in 都是 in
2.单词的是被非字母分隔的...就是说如果用scanf("%s",s)或者cin>>s来读一串被空格或者回车或者结束符隔开的字符串..要把头尾的非字母忽略掉..并且这样读出来里面包含的单词也可能不止一个...比如说一串连续一个字符串: a,a,a,a,a,a,a,a,a,a 应该有10个a..我就是这里没注意..WA了好久..
Program:
#include<iostream>
#include<queue>
#include<string.h>
#include<stdio.h>
using namespace std;
struct node
{
int w,son[27];
}T[100005];
int t,len,l,h,p,i,m,k,cases;
char s[10005];
bool f;
void DFS(int h,int p)
{
if (T[h].w==t)
{
s[p]='\0';
puts(s);
f=false;
}
int i;
for (i=0;i<26;i++)
if (T[h].son[i])
{
s[p]=i+'a';
DFS(T[h].son[i],p+1);
}
return;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
cases=0;
while (~scanf("%d",&t))
{
scanf("%s",s);
T[0].w=0;
m=0;
memset(T[0].son,0,sizeof(T[0].son));
while (1)
{
//EndOfText
l=strlen(s);
if (l==9 && s[0]=='E' && s[1]=='n' && s[2]=='d'
&& s[3]=='O' && s[4]=='f' && s[5]=='T'
&& s[6]=='e' && s[7]=='x' && s[8]=='t') break;
i=0;
while (i<l)
{
h=0;
for (;i<l;i++)
if ((s[i]>='A' && s[i]<='Z')||(s[i]>='a' && s[i]<='z')) break;
for (;i<l;i++)
{
if ((s[i]<'A' || s[i]>'Z')&&(s[i]<'a' || s[i]>'z')) break;
if (s[i]>='A' && s[i]<='Z') s[i]=s[i]-'A'+'a';
if (!T[h].son[s[i]-'a'])
{
T[h].son[s[i]-'a']=++m;
T[m].w=0;
memset(T[m].son,0,sizeof(T[m].son));
}
h=T[h].son[s[i]-'a'];
}
if (h) T[h].w++;
}
scanf("%s",s);
}
f=true;
if (cases) printf("\n");
DFS(0,0);
if (f) printf("There is no such word.\n");
cases++;
}
return 0;
}