题目
代码
#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;
}