[ACWING/CCF]5720. 相似度计算

第一种:char 二维数组存储字符串进行去重与比较,复杂度较高。

#include <bits/stdc++.h>
using namespace std;
char a[10005][12];
char a1[10005][12];
char b[10005][12];
char b1[10005][12];
/*string类不能与char类进行strcmp,都用char就行了
char 二位输出字符串操作:1.字符串赋值,strcpy(s1,s2)
2.字符串比较,strcmp(s1,s2),相等retrun 0,不同return 1
3.小写转换大写:char 'a'-32;
*/
int main()
{
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];//默认以空格中止输入与输出
        //把所有小写字母转换成大写
        for(int j=0;j<=11;j++)
        {
            if(a[i][j]>='a'&&a[i][j]<='z')
            {
                a[i][j]=a[i][j]-32;
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        cin>>b[i];
        //把所有小写字母转换成大写
        for(int j=0;j<=11;j++)
        {
            if(b[i][j]>='a'&&b[i][j]<='z')
            {
                b[i][j]=b[i][j]-32;
            }
        }
    }
    int l=1;int c1,c2;//记录去重后数组内单词个数
    c1=0;c2=0;
    for(int i=1;i<=n;i++)//去重
    {
        char s[12];strcpy(s,a[i]);
        int t=0;
        for(int j=1;j<=n;j++)
        {
            if(!strcmp(s,a1[j]))
            {
                t++;
            }
        }
        if(t==0)
        {
            strcpy(a1[l],s);l++;
        }
    }
    c1=l-1;
    l=1;
    for(int i=1;i<=m;i++)//去重
    {
        char s[12];strcpy(s,b[i]);
        int t=0;
        for(int j=1;j<=m;j++)
        {
            if(!strcmp(s,b1[j]))
            {
                t++;
            }
        }
        if(t==0)
        {
            strcpy(b1[l],s);l++;
        }
    }
    c2=l-1;int ans1,ans2;//表示多少个不同的单词同时出现在两篇文章中与两篇文章一共包含了多少个不同的单词。
    ans1=0;ans2=0;
    //ans1=c1+c2-ans1;
    for(int i=1;i<=c1;i++)
    {
        for(int j=1;j<=c2;j++)
        {
            if(!strcmp(a1[i],b1[j]))
            {
                ans1++;
            }
        }
    }
    ans2=c1+c2-ans1;
    cout<<ans1<<endl<<ans2<<endl;
    return 0;
}

第二种:利用STL—set容器实现。参考:C++STL之Set容器 - 数据结构教程 - C语言网 

思路:分别存储作品1的所以不同元素的set()与作品2的,则总不重复单词个数为二者set的size之和,二者set()再合并便为AUB元素集合,A∩B就是总单词个数-AUB元素集合size

#include <bits/stdc++.h>
using namespace std;
string a[10005];
string b[10005];
set<string> w1;
set<string> w2;
set<string> combine;//存a,b都不同的单词,就是AUB,去重的并集
//利用STLSet容器计算
int main()
{
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];//默认以空格中止输入与输出
        //把所有小写字母转换成大写
        for(int j=0;j<=11;j++)
        {
            if(a[i][j]>='a'&&a[i][j]<='z')
            {
                a[i][j]=a[i][j]-32;
            }
        }
        w1.insert(a[i]);
        combine.insert(a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>b[i];
        //把所有小写字母转换成大写
        for(int j=0;j<=11;j++)
        {
            if(b[i][j]>='a'&&b[i][j]<='z')
            {
                b[i][j]=b[i][j]-32;
            }
        }
        w2.insert(b[i]);
        combine.insert(b[i]);
    }
    cout<<w1.size()+w2.size()-combine.size()<<endl;
    cout<<combine.size()<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luminous815

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值