【2024蓝桥杯/C++/B组/前缀总分】

题目

代码

#include<bits/stdc++.h>
using namespace std;

// 定义常量N为210,用于数组的大小
const int N = 210;
// 声明n为整型变量,用于存储字符串的数量
int n;
// 声明一个字符串数组str,大小为N,用于存储字符串
string str[N];
// 声明一个二维整型数组matrix,大小为N*N,用于存储每对字符串间的相似度
int matrix[N][N];
// 声明score为整型变量,用于记录所有字符串之间的相似度总和
int score;

// 函数cal用于计算两个字符串s1和s2的相同前缀长度
int cal(string s1, string s2)
{
    // 定义sum用于存储相同前缀的长度
    int sum = 0;

    // i用于遍历两个字符串中的字符
    int i = 0;
    // 当两个字符串都没有遍历到末尾时循环
    while(s1[i] != '\0' && s2[i] != '\0')
    {
        // 如果当前字符相同,则sum加1,i加1
        if(s1[i] == s2[i]) sum++, i++;
        // 如果不同则跳出循环
        else break;
    }

    // 返回sum
    return sum;
}
// 函数cal_all用于计算所有字符串之间的相似度总和
int cal_all()
{
    // 初始化sum为0
    int sum = 0;
    // 遍历每一个字符串
    for(int i = 1; i <= n; i++)
    {
        // 再次遍历每一个字符串,从i+1开始,避免重复计算
        for(int j = i+1; j <= n; j++)
        {
            // 计算字符串i与字符串j之间的相似度,并存入matrix[i][j]
            matrix[i][j] = cal(str[i], str[j]);
            // 更新字符串i的整体相似度
            matrix[i][0] += matrix[i][j];
            // 累加到sum中
            sum += matrix[i][j];
        }
    }

    // 返回所有字符串之间的相似度总和
    return sum;
}
// 函数cal_part用于计算将某个字符串替换后,所有字符串之间的相似度总和
int cal_part(int i)
{
    // 初始化sum为0
    int sum = 0;
    // 遍历每一个字符串
    for(int j = 1; j <= n; j++)
    {
        // 跳过自身
        if(i == j) continue;
        // 累加字符串i与其他字符串的相似度
        sum += cal(str[i], str[j]);
        // 加上其他字符串的整体相似度
        sum += matrix[j][0];
        if(j < i) sum -= matrix[j][i];
    }

    // 返回新的相似度总和
    return sum;
}
// 主函数
int main()
{
    // 输入n的值
    cin >> n;
    // 输入n个字符串并存入数组str
    for(int i = 1; i <= n; i++) cin >> str[i];

    // 计算所有字符串之间的相似度总和
    score = cal_all();

    // 对每一个字符串进行替换操作
    for(int i = 1; i <= n; i++)
    {
        // 遍历字符串i中的每个字符
        for(char& c : str[i])
        {
            // 尝试用'a'到'z'的每个字符替换当前字符
            for(char ch = 'a'; ch <= 'z'; ch++)
            {
                int backup = c;
                // 替换当前字符
                c = ch;
                // 计算替换后的相似度总和
                int tmp = cal_part(i);
                // 更新最大相似度总和
                score = max(score, tmp);
                c = backup;
            }
        }
    }

    // 输出最大相似度总和
    cout << score;

    // 主函数返回0,表示程序正常结束
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值