题解:洛谷 AT_abc471_b Survey Tabulation

【题目来源】

洛谷:AT_abc471_b [ABC471B] Survey Tabulation

【题目描述】

Takahashi 正在统计一份问卷的调查结果。

这份问卷共有 \(n\) 个人作答,其中第 \(i\) 个人的答案是仅包含英文字母的字符串 \(S_i\)

你需要找到给出相同答案的人数的最大值。

英文字母不区分大小写,比如 AtCoderATCODERatcoder 被视为相同的答案。

【输入】

输入由标准输入以如下格式给出:

\(N\) \(S_1\cdots S_n\)

【输出】

输出给出相同答案的人数的最大值。

【输入样例】

7
ARC
abc
ahc
ABC
beginner
AbC
ahc

【输出样例】

3

【核心思想】

  1. 问题分析:给定 \(N\) 个调查答案字符串 \(S_i\),要求统计忽略大小写后,出现次数最多的答案有多少人选择。这是一个字符串统计问题,关键在于将每个答案统一转换为同一种大小写形式后进行哈希计数。

  2. 算法选择

    • 字符串规范化 + 哈希映射:将每个答案转换为全小写(或全大写),用 map<string, int> 统计每种规范化后的答案出现次数
    • 在线更新最大值:每次插入时同步更新当前最大出现次数,避免最后遍历
  3. 关键步骤

    • 初始化:读取 \(N\)(调查人数),初始化 ans = -1
    • 处理每个答案\(i\)\(1\)\(N\)):
      • 读取字符串 \(t\)
      • 大小写转换:遍历 \(t\) 的每个字符,用 tolower() 转为小写
      • 计数更新mp[t]++
      • 最大值更新ans = max(ans, mp[t])
    • 输出 \(\text{ans}\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N \cdot L)\)\(L\) 为字符串平均长度,每次转换和哈希操作均为 \(O(L)\)
    • 空间复杂度:\(O(N \cdot L)\)map 存储所有不同的规范化答案
  5. 字符串统计的核心思想

    • 规范化预处理:忽略大小写的本质是定义字符串的等价类,统一转为小写是最简洁的实现方式
    • 哈希计数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
posted @ 2026-08-23 22:00  团爸讲算法  阅读(5)  评论(0)    收藏  举报