题解:洛谷 AT_abc471_b Survey Tabulation
【题目来源】
洛谷:AT_abc471_b [ABC471B] Survey Tabulation
【题目描述】
Takahashi 正在统计一份问卷的调查结果。
这份问卷共有 \(n\) 个人作答,其中第 \(i\) 个人的答案是仅包含英文字母的字符串 \(S_i\)。
你需要找到给出相同答案的人数的最大值。
英文字母不区分大小写,比如 AtCoder,ATCODER 和 atcoder 被视为相同的答案。
【输入】
输入由标准输入以如下格式给出:
\(N\) \(S_1\cdots S_n\)
【输出】
输出给出相同答案的人数的最大值。
【输入样例】
7
ARC
abc
ahc
ABC
beginner
AbC
ahc
【输出样例】
3
【核心思想】
-
问题分析:给定 \(N\) 个调查答案字符串 \(S_i\),要求统计忽略大小写后,出现次数最多的答案有多少人选择。这是一个字符串统计问题,关键在于将每个答案统一转换为同一种大小写形式后进行哈希计数。
-
算法选择:
- 字符串规范化 + 哈希映射:将每个答案转换为全小写(或全大写),用
map<string, int>统计每种规范化后的答案出现次数 - 在线更新最大值:每次插入时同步更新当前最大出现次数,避免最后遍历
- 字符串规范化 + 哈希映射:将每个答案转换为全小写(或全大写),用
-
关键步骤:
- 初始化:读取 \(N\)(调查人数),初始化
ans = -1 - 处理每个答案(\(i\) 从 \(1\) 到 \(N\)):
- 读取字符串 \(t\)
- 大小写转换:遍历 \(t\) 的每个字符,用
tolower()转为小写 - 计数更新:
mp[t]++ - 最大值更新:
ans = max(ans, mp[t])
- 输出 \(\text{ans}\)
- 初始化:读取 \(N\)(调查人数),初始化
-
时间/空间复杂度:
- 时间复杂度:\(O(N \cdot L)\),\(L\) 为字符串平均长度,每次转换和哈希操作均为 \(O(L)\)
- 空间复杂度:\(O(N \cdot L)\),
map存储所有不同的规范化答案
-
字符串统计的核心思想:
- 规范化预处理:忽略大小写的本质是定义字符串的等价类,统一转为小写是最简洁的实现方式
- 哈希计数:
map提供 \(O(\log M)\) 的查询和插入(\(M\) 为不同答案数),也可用unordered_map优化到 \(O(1)\) 平均 - 在线维护最大值:边读入边统计,无需二次遍历,代码更简洁
- 适用于字符串频次统计、大小写不敏感匹配、投票统计类问题
【算法标签】
普及- #字符串入门
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, ans=-1; // n:调查人数, ans:相同答案的最大人数
map<string, int> mp; // mp[s]:答案s(小写化后)出现的次数
int main()
{
cin >> n; // 读入调查人数
for (int i=1; i<=n; i++)
{
string t; cin >> t; // 读入第i个人的答案
// 将答案全部转换为小写,实现大小写不区分
for (int j=0; j<t.size(); j++)
t[j] = tolower(t[j]);
mp[t]++; // 该答案出现次数加1
ans = max(ans, mp[t]); // 更新最大出现次数
}
cout << ans << endl; // 输出相同答案的最大人数
return 0;
}
【运行结果】
7
ARC
abc
ahc
ABC
beginner
AbC
ahc
3
浙公网安备 33010602011771号