/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
2020-03-22
查找兄弟单词
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//查找兄弟单词的函数接口,兄弟单词:单词的字母及其个数相同,但字母的排列顺序不全相同
int Search_Brother_Word(int num)
{
    string str; //字典里面的单词(小写英文字符)
    string word; //指定的单词
    vector <string> vec; //用一个向量来存储单词(形成单词字典)
    vector <string> vec_BW; //用一个向量来存储兄弟单词(形成兄弟单词字典),BW 代表 Brother Word
    int BW_index; //序号,用于查找指定单词的所有兄弟单词中序号所对应的兄弟单词(序号减一,因为从零开始)
    //输入单词,形成单词字典
    for (int i = 0; i < num; i++)
    {
        cin >> str;
        vec.push_back(str);
    }
    sort(vec.begin(), vec.end()); //输入的多个单词按字典序排列
    cin >> word; //指定单词,当然这个单词可能在、也可能不在原来的字典里面
    cin >> BW_index; //指定单词 word 的所有兄弟单词中排在第 BW_index 的单词对应序号 BW_index - 1
    //判断字典中的单词是否为指定单词的兄弟单词,若是,则将其写入兄弟单词向量 vec_BW
    string word_copy = word; //拷贝一份指定的单词,作为基准比较(字母顺序未变动)
    sort(word.begin(), word.end()); //指定的单词的字母按字典序排列
    //遍历单词字典,寻找指定单词的兄弟单词并记录在兄弟单词字典中
    for (int i = 0; i < vec.size(); i++)
    {
        //先判断字典中的单词的长度和指定单词的长度是否一致
        if (vec[i].size() == word.size())
        {
            //长度相同且字母顺序不同的单词,才可能是兄弟单词,这里反复用单词的拷贝来作为基准
            if (vec[i] != word_copy)
            {
                string copy = vec[i]; //提前拷贝一份字典中的单词,作为后续写入兄弟单词字典的样本(需要的话)
                sort(vec[i].begin(), vec[i].end()); //字典中的单词的字母按字典序排列
                //原本不相同的单词,经过字母排序后相同,才是互为兄弟单词
                if (vec[i] == word)
                {
                    vec_BW.push_back(copy);
                }
            }
        }
    }
    //分类输出结果
    //兄弟单词字典为空
    if (vec_BW.size() == 0)
    {
        cout << 0 << endl;
    }
    //兄弟单词字典不为空,但待查找的兄弟单词不存在
    else if (((vec_BW.size() > 0) && (vec_BW.size() < BW_index)) || ((vec_BW.size() > 0) && (BW_index < 1)))
    {
        cout << vec_BW.size() << endl;
    }
    //兄弟单词字典不为空,且待查找的兄弟单词存在
    else if ((vec_BW.size() > 0) && (vec_BW.size() >= BW_index) && (BW_index >= 1))
    {
        cout << vec_BW.size() << '\n' << vec_BW[BW_index - 1] << endl;
    }
    return 0;
}
//主函数
int main()
{
    int num;
    while (cin >> num)
    {
        Search_Brother_Word(num);
    }
    return 0;
}