数据结构与算法题目集(中文) - 7-44 基于词频的文件相似度(30 分)

题目链接:点击打开链接

题目大意:略。

解题思路:

1、单词筛选(考虑长度)并统一大或小写。
2、set 自带去重统计 + st.size()(用 set 存放且用 set 统计)。
3、注意:一开始存放的时候,直接去重。
4、用 set count 来做最后的统计,否则用其他容器统计完又清空会 TLE。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

set<string> st[110];

int main()
{
    int n;
    char ts[15],s[100];
    while(~scanf("%d",&n))
    {
        int kase=1;
        for(int i=0;i<110;i++) st[i].clear();

        while(~scanf("%s",s))
        {
            int len=strlen(s),k=0;
            if(s[0]=='#' && len==1)
            {
                if(kase++==n) break;
            }

            for(int i=0;i<len;i++)
            {
                if(s[i]>='a'&&s[i]<='z') s[i]=toupper(s[i]);
            }

            for(int i=0,f=0;i<len;i++)
            {
                char c=s[i];
                if(isupper(c))
                {
                    if(f) continue;
                    ts[k++]=c;
                    if(k>=10) // 超过10,有字符分隔else会处理,没有字符分隔这边处理
                    {
                        ts[k++]='\0';
                        f=1;
                        k=0; // 避免与for外面的判断混淆
                        st[kase].insert(ts);
                    }
                }
                else // 有字符分隔
                {
                    if(!f) // 没超过10
                    {
                        if(k>=3)
                        {
                            ts[k++]='\0';
                            st[kase].insert(ts);
                        }
                    }
                    else; // 超过10
                    f=0;
                    k=0;
                }
            }

            if(k>=3)
            {
                ts[k++]='\0';
                st[kase].insert(ts);
            }
        }

//        for(int i=1;i<=n;i++)
//        {
//            printf("%d:\n",i);
//            for(set<string>::iterator it=st[i].begin();it!=st[i].end();it++)
//            {
//                printf("%s ",(*it).c_str());
//            }
//            puts("\n-----------------");
//        }

        int m,a,b; scanf("%d",&m);
        for(int i=0,up;i<m;i++)
        {
            up=0;
            scanf("%d%d",&a,&b);

            int mi=min(st[a].size(),st[b].size());
            if(st[a].size()==mi)
            {
                for(set<string>::iterator it=st[a].begin();it!=st[a].end();it++)
                    if(st[b].count(*it)==1) up++;
            }
            else
            {
                for(set<string>::iterator it=st[b].begin();it!=st[b].end();it++)
                    if(st[a].count(*it)==1) up++;
            }

            printf("%.1f%%\n",up*1.0/(st[a].size()+st[b].size()-up)*100);
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/81234784
今日推荐