哎嘿,本蒟蒻又来写题解了,一样,因为没有学长写一篇详解,所以来水一篇(p≧w≦q)\

注意事项

本篇题解面向和我一样的蒟蒻们,老登直接跳过吧~~( ﹁ ﹁ ) ~~~

首先,我们先介绍一下一个非常经典的算法————分桶法,顾名思义,其精髓在于将数据分到一个个抽象的桶中,就像把一个个不同颜色的小球扔进不同的桶中,从而分出不同颜色的小球一样。

本题的思想与其高度相似,对于不同的字符串,我们直接将相同缩写的字符串扔进对应缩写的桶,输出时把对应桶全部倒出来

using namespace std;
#define endl '\n'
const int maxn = 26;
map<string,vector<string>> ma;
string s;

int n,q;
int main()
{
    cin >> n >> q;
    for(int i = 0;i<n;i++)
    {
        cin >> s;
        string a = "";
        for(int i = 0;i<s.length();i++)
        {
            if(s[i] >='A' && s[i] <='Z')a+=s[i];
        }
        ma[a].push_back(s);
    }
    
    for(int i = 0;i<q;i++)
    {
		cin >> s;
		int si = ma[s].size();
		cout << si << endl;
		for(int i = 0;i<si;i++)cout << ma[s][i] << endl;
    }
}

简单介绍一下实现
首先,我们用map类型来实现桶,string类型为键,vector为装入内容物,即为值,其中键和值是一一对应的。
(实际上,本题的优解应该是unordered_map,但是在本题中,性能没有太大的差别,所以选择了最熟悉的map)\

缩写的确定

缩写实际上是字符串中大写字母的集合。这里,每次输入一个字符串,都会尝试将其遍历,检查字母的大小写,如果是则加上,不是则略过,这里涉及到了ASCII编码,string和vector数组,不熟悉的同学可以去温习一下(/ω\)\

尾声

本题没有坑点,很基础的模拟。
本人实力很弱,各位大佬轻喷
Orz
Orz
Orz
Orz
Orz
Orz