题目
公司命名
- 将所有后缀分成不同的组,利用int 存储每个字母的首字母,状态压缩==> t|=1<<(s[0]-'a');
- 递推,cnt[26][26],i,j,cnt[i][j]表示前面的组中 没有i 有j的个数
- 遍历所有组,如果组中有i字母,而没有j字母既可以增加数值
- 如果组中没有i字母,但是有j字母,可以为后续的组添加不同的次数
class Solution {
public:
long long distinctNames(vector<string> &ideas) {
unordered_map<string, int> group;
for (auto &s : ideas)
group[s.substr(1)] |= 1 << (s[0] - 'a');
long ans = 0L;
int cnt[26][26]; memset(cnt, 0, sizeof(cnt));
for (auto &[_, mask] : group)
for (int i = 0; i < 26; i++)
if ((mask >> i & 1) == 0) {
for (int j = 0; j < 26; j++)
if (mask >> j & 1) ++cnt[i][j];
} else {
for (int j = 0; j < 26; j++)
if ((mask >> j & 1) == 0) ans += cnt[i][j];
}
return ans * 2;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)