2015年9月28日 星期一

[UVA] 860 - Entropy Text Analyzer

題意:
給你一篇文章,分別求出 λ , ET , Erel ,題目有給公式!

其中 λ 是文章總共有多少單字。
Pi 是每一種單字出現的次數。

--------------------------------------------------

方法:
要把所有單字都轉成小寫!
然後可以用二元組去存,<string,int>分別代表單字與其出現的次數,
然後就代公式囉!
注意 ET 和 Erel 要用浮點數去存,
還有don't 不等於 dont 喔,這樣算兩個不同的單字!
yeah

--------------------------------------------------


/* 20150928
 * hanting
 * UVa 860 - Entropy Text Analyzer
 * C++
 */
#include <iostream>
#include <cstring> //strtok
#include <map>
#include <cmath> //log
#include <iomanip> //setprecision
using namespace std;
string normalize(string str)
{
    string tmp="";
    for(int i=0;i<str.size();i++)
    {
        tmp+=tolower(str[i]);
    }
    return tmp;
}
int main()
{
    string str;
    while(getline(cin,str) and str!="****END_OF_INPUT****")
    {
        int lambda=0;
        double ET=0,Erel=0,Emax=0;
        map<string,int> Map;
        char *pch=strtok((char*)str.c_str(),",.:;!?\"() ");
        while(pch)
        {
            string tmp;
            tmp=normalize(pch);
            Map[tmp]++;
            lambda++;
            pch=strtok(NULL,",.:;!?\"() ");
        }
        while(getline(cin,str) and str!="****END_OF_TEXT****")
        {
            pch=strtok((char*)str.c_str(),",.:;!?\"() ");
            while(pch)
            {
                string tmp=normalize(pch);
                Map[tmp]++;
                lambda++;
                pch=strtok(NULL,",.:;!?\"() ");
            }
        }
        double sum=0;
        for(map<string,int>::iterator it=Map.begin();it!=Map.end();++it)
        {
            int pi=it->second;
            sum+=(pi)*(log10(lambda)-log10(pi));
        }
        ET=sum/lambda;

        Emax=log10(lambda);
        Erel=ET/Emax*100;

        cout<<lambda;
        cout<<fixed<<setprecision(1)<<" "<<ET<<" ";
        cout<<fixed<<setprecision(0)<<Erel<<endl;
    }
    return 0;
}

沒有留言:

張貼留言