题目大意:找出若干字符串中出现频率最高的字符串并输出。
分析:Tire树的应用,不过本题数据量比较小,纯暴力也能A。
Tire树实现代码如下:
#include <cstdio> #include <cstdlib> #include <iostream> using namespace std; #define son_num 30 //字符串中包含的字符个数 #define maxn 15 //单词的最大长度 struct tire { int num; //纪录到达该节点的字符串的个数,即相同前缀数 bool terminal; //如果terminal=true,表示当前点为该字符串最后一个字符 struct tire *next[son_num]; //纪录下一个节点 }; void insert(tire *root,char str[]) //插入操作 { int i=0; tire *p=root; while(str[i]!='\0') { if(!p->next[ str[i]-'a' ]) //如果不存在,建立新节点 { tire *q=(tire *)malloc(sizeof(tire)); for(int i=0;i<son_num;i++) q->next[i]=NULL; q->terminal=false; q->num=0; p->next[ str[i]-'a' ]=q; } p=p->next[ str[i]-'a' ]; p->num++; i++; } p->terminal=true; } int find(tire *p,char str[]) //查找操作 { int i=0; while(str[i]!='\0'&&p->next[ str[i]-'a' ]) { p=p->next[ str[i]-'a' ]; i++; } if(str[i]=='\0'&&p->terminal) return p->num; return 0; } void del(tire *root) //清空操作 { for(int i=0;i<son_num;i++) if(root->next[i]!=NULL) del(root->next[i]); free(root); } int main() { int n; //建立字典树的单词数 while(cin>>n&&n){ tire *root=(tire *)malloc(sizeof(tire)); //定义根结点 for(int i=0;i<son_num;i++) root->next[i]=NULL; root->terminal=false; root->num=0; char str[1005][maxn]; for(int i=0;i<n;i++) //建立字典树 { cin>>str[i]; insert(root,str[i]); } int ans=0,tmp=0; for(int i=0;i<n;i++) //查找操作 { int cnt=find(root,str[i]); if(ans<cnt) { ans=cnt; tmp=i; } } printf("%s\n",str[tmp]); del(root); //释放字典树占用的空间 } return 0; }
暴力代码如下:
#include <cstdio> #include <cstring> using namespace std; char balloon[1001][20]; int main() { int n,i,j,num,max; char ans[20],temp[20]; while(scanf("%d",&n)) { if(n==0) break; max=0; for(i=0;i<n;i++) scanf("%s",balloon[i]); for(i=0;i<n;i++) { num=0; strcpy(temp,balloon[i]); for(j=i;j<n;j++) { if(strcmp(temp,balloon[j])==0) num++; if(max<num) { max=num; strcpy(ans,temp); } } } printf("%s\n",ans); } return 0; }