Hoj 1307 Choose Your Words Carefully、Hoj 1989 The Most Frequent Word

来源:互联网 发布:netty 好书 知乎 编辑:程序博客网 时间:2024/05/17 08:22

题目:http://acm.hit.edu.cn/hoj/problem/view?id=1307

本题虽然是水题,但是我还是比较喜欢做的,能锻炼思维,比较类似于编译原理的词法分析。

题意是要统计一段文章出现频率最高的单词。用map<string,int>统计即可。

另外题目要求按照字典序排列,但是好像Map已经有这个功能了,所以就不写了。

练习一下C++ string的用法。

默认map是根据key值从小到大排序的。

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <algorithm>#include <stack>#include <queue>#include <map>using namespace std;int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);#endif    char word[122];    string a;    map<string,int> m;    int max = 1;    while(scanf(" %s",word)!=EOF)    {        a.clear();        int flag = 0;        for(int i=0; i<strlen(word); i++)        {            if(isalpha(word[i]) || (word[i]>='0' && word[i]<='9'))            {                flag = 1;                if(word[i]>='A' && word[i]<='Z')                {                    word[i] += 32;                }                a.push_back(word[i]);            }            else if(flag == 1)            {                if(m.find(a) == m.end())                {                    m.insert(make_pair(a,1));                }                else                {                    m[a]++;                    if(m[a]>max)                    {                        max = m[a];                    }                }                a.clear();                flag = 0;            }        }        if(flag == 1)        {            if(m.find(a) == m.end())            {                m.insert(make_pair(a,1));            }            else            {                m[a]++;                if(m[a]>max)                {                    max = m[a];                }            }        }    }    printf("%d occurrences\n",max);    for(map<string,int>::iterator i = m.begin();i!=m.end();i++)    {        if(i->second == max)        {            printf("%s\n",i->first.c_str());        }    }    return 0;}

题目:http://acm.hit.edu.cn/hoj/problem/view?id=1989

与上题一样,我直接用上题的代码A掉。

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <algorithm>#include <stack>#include <queue>#include <map>using namespace std;int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);#endif    char word[122];    string a;    map<string,int> m;    int max = 1;    while(scanf(" %s",word)!=EOF && strcmp(word,"#")!=0)    {        a.clear();        int flag = 0;        for(int i=0; i<strlen(word); i++)        {            if(isalpha(word[i]) || (word[i]>='0' && word[i]<='9'))            {                flag = 1;                if(word[i]>='A' && word[i]<='Z')                {                    word[i] += 32;                }                a.push_back(word[i]);            }            else if(flag == 1)            {                if(m.find(a) == m.end())                {                    m.insert(make_pair(a,1));                }                else                {                    m[a]++;                    if(m[a]>max)                    {                        max = m[a];                    }                }                a.clear();                flag = 0;            }        }        if(flag == 1)        {            if(m.find(a) == m.end())            {                m.insert(make_pair(a,1));            }            else            {                m[a]++;                if(m[a]>max)                {                    max = m[a];                }            }        }    }    //printf("%d occurrences\n",max);    for(map<string,int>::iterator i = m.begin();i!=m.end();i++)    {        if(i->second == max)        {            printf("%s\n",i->first.c_str());            break;        }    }    return 0;}


原创粉丝点击