小明找前缀100000(假)

news2024/11/28 3:36:44

题目背景

小明最近上课天天睡觉,于是啥都不会。

一天,老师终于点兵点将点到他回答问题,你能帮他渡过难关吗?

现在老师给了小明 n 个由 0、1 构成的字符串,然后有 m 次询问,

每次询问给出一个由 0、1 构成的字符串,

小明需要在最开始的 n 个字符串中找出和当前字符串匹配的前缀最长的串。

如果有多个前缀最长的串,请找出字典序最小的那个。

如果小明找不出来,小明就无了,你能帮助小明吗?

输入格式:

输入第一行是一个整数 t ,表示有 t 组测试实例。

对于每组输入:

输入第一行包含一个整数 n ,代表接下来有 n 行。

接下来 n 行,每行1个字符串,字符串只由0、1构成。

接下来这一行有一个整数 m ,表示询问次数。

接下来 m 行,每行1个字符串,字符串只由0、1构成。

对于每一次询问,你需要求出匹配的前缀最长的字符串,如果有多个答案,请输出字典序最小的那个。

输出格式:

对于每组输入:

输出共 m 行,每行一个字符串对应询问的答案。

输入样例:

2
5
0100
0101
011
10110
10111
1
10011011
4
01
1001
1011100
00110
2
100011
01100

输出样例:

10110
1001
01

 先上超时代码(14分)

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
vector<string>v;
int N, t;
string str;
void sove()
{
    v.clear();
    cin >> N;
    while (N--)
    {
        cin >> str;
        v.emplace_back(str);
    }
    sort(v.begin(), v.end());
    cin >> N;
    while (N--)
    {
        cin >> str;
        int res = 0;
        string ch ;
        ch += str[0];
        auto it = lower_bound(v.begin(), v.end(), ch);
        string ans = v[(int)(it - v.begin())];
        int pos = (int)(it - v.begin());
        for (int i = pos; i < v.size(); i++)
        {
            int len = 0;
            for(int j = 0;j < v[i].size();j++)
                if(str[j] == v[i][j])len++;
            else break;
            if(len >= res) 
            {
                if(len > res)res = len,ans = v[i];
                else
                 ans = min(ans,v[i]);
            }
            else break;
        }
        cout << ans << endl;
    }
}

int main()
{
    cout.tie(0);
    cin.tie(0)->sync_with_stdio(false);
    cin >> t;
    while (t--)
        sove();
    return 0;
}

如何解决?>>01树(本质就是字典树,算是字典树的特殊情况,即树中元素均为0或1)

受不了这个模拟(有点麻烦讲真的)

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int maxn = 500 + 10;
int n, t, m;
bool is = true;
string str;
struct Tree
{
    char ch;
    bool flag;
    Tree* L, * R;
    Tree(char c) :ch(c), L(NULL), R(NULL), flag(false) {};
};

Tree* Built_01Tree(Tree* root, string str, int w)
{
    if(str.size() == 1)
    {
        if(str[w] == '1'&& !root -> L)
        {
            root -> L = new Tree('1');
            root -> L -> flag = true;
        }
        else if(str[w] == '0' && !root -> R)
        {
            root -> R = new Tree('0');
            root -> R -> flag = true;
        }
        else
        {
            str[w] == '1' ? root -> L -> flag = true : root -> R -> flag = true;
        }
            return root;
    }
    if (w == str.size())return NULL;
    if (!root)
        root = new Tree(str[w]);
    if (w == str.size() - 1) root -> flag = true;
    else if (root->ch == str[w] && w + 1 <= str.size())
        str[w + 1] == '1' ? root->L = Built_01Tree(root->L, str, w + 1) : root->R = Built_01Tree(root->R, str, w + 1);
    else if (root->ch != str[w] && w + 1 <= str.size())
        str[w] == '1' ? root->L = Built_01Tree(root->L, str, w) : root->R = Built_01Tree(root->R, str, w);
    return root;
}

string Find(Tree* root, string str, int w)
{
    string ans;
    if (!root)return ans;
    ans += root -> ch;
    if(is)
    {
        if(w >= str.size() && root -> flag)return ans;
        if(root -> flag && !is) return ans;
        if(root -> flag && w == str.size())return ans;
        if(root -> R && root -> R -> ch == str[w])ans += Find(root -> R,str,w + 1);
        else if(root -> L && root -> L -> ch == str[w])ans += Find(root -> L,str,w + 1);
        else
        {
            is = false;
            if(root -> flag)return ans;
            root -> R ? ans += Find(root -> R,str,w + 1) : ans += Find(root -> L,str,w + 1);
        }
    }
    else
    {
        if(root -> flag)return ans;
        //if(root -> flag && w == str.size())return ans;
        root -> R ? ans += Find(root -> R,str,w + 1) : ans += Find(root -> L ,str,w + 1);
    }
    return ans;
};

void pre_cout(Tree* root)
{
    if (!root)return;
    cout << root->ch;// << " ";
    pre_cout(root->L);
    pre_cout(root->R);
}

void solve()
{
    cin >> n;
    Tree* root = new Tree('H');
    while (n--)
    {
        cin >> str;
     //   cout << str << endl;
        Built_01Tree(root, str, 0);
    }
    // pre_cout(root);
    // cout << endl;
    cin >> n;
    while (n--)
    {
        cin >> str;
        is = true;
        string ans = Find(root, str, 0);
        ans.erase(0, 1);
        cout << ans << endl;
    }
}

int main()
{
    IOS
        cin >> t;
    while (t--)
        solve();
    return 0;
}

// //H101110011010
// //H101110001010110





其中:对于答案的求法:情况如下:

1:  如果有当前前缀可以匹配则继续向下搜索

2 : 如果当前前缀无法匹配且改结点是一个01串的终点,结束搜索返回答案

3:如果当前前缀无法匹配但是改结点不是01串终点,根据输出字典序最小的,先访问0结点位置是否存在,存在向0方向搜索,反之向1方向搜索

将测试代码剔除后,有效代码如下:

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int n, t, m;
bool is = true;
string str;
struct Tree
{
    char ch;
    bool flag;
    Tree* L, * R;
    Tree(char c) :ch(c), L(NULL), R(NULL), flag(false) {};
};

Tree* Built_01Tree(Tree* root, string str, int w)
{
    if(str.size() == 1)
    {
        if(str[w] == '1'&& !root -> L)
        {
            root -> L = new Tree('1');
            root -> L -> flag = true;
        }
        else if(str[w] == '0' && !root -> R)
        {
            root -> R = new Tree('0');
            root -> R -> flag = true;
        }
        else
            str[w] == '1' ? root -> L -> flag = true : root -> R -> flag = true;
            return root;
    }
    if (!root)
        root = new Tree(str[w]);
    if (w == str.size() - 1) root -> flag = true;
    else if (root->ch == str[w] && w + 1 <= str.size())
        str[w + 1] == '1' ? root->L = Built_01Tree(root->L, str, w + 1) : root->R = Built_01Tree(root->R, str, w + 1);
    else if (root->ch != str[w] && w + 1 <= str.size())
        str[w] == '1' ? root->L = Built_01Tree(root->L, str, w) : root->R = Built_01Tree(root->R, str, w);
    return root;
}

string Find(Tree* root, string str, int w)
{
    string ans;
    if (!root)return ans;
    ans += root -> ch;
    if(is)
    {
        if(w >= str.size() && root -> flag)return ans;
        if(root -> R && root -> R -> ch == str[w])ans += Find(root -> R,str,w + 1);
        else if(root -> L && root -> L -> ch == str[w])ans += Find(root -> L,str,w + 1);
        else
        {
            is = false;
            if(root -> flag)return ans;
            root -> R ? ans += Find(root -> R,str,w + 1) : ans += Find(root -> L,str,w + 1);
        }
    }
    else
    {
        if(root -> flag)return ans;
        root -> R ? ans += Find(root -> R,str,w + 1) : ans += Find(root -> L ,str,w + 1);
    }
    return ans;
};

void solve()
{
    cin >> n;
    Tree* root = new Tree('H');
    while (n--)
    {
        cin >> str;
        Built_01Tree(root, str, 0);
    }
    cin >> n;
    while (n--)
    {
        cin >> str;
        is = true;
        string ans = Find(root, str, 0);
        ans.erase(0, 1);
        cout << ans << endl;
    }
}

int main()
{
    cin.tie(0) -> sync_with_stdio(false);
        cin >> t;
    while (t--) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【医学图像】图像分割系列.3 (uncertainty)

介绍几篇使用不确定性引导的医学图像分割论文&#xff1a;UA-MT&#xff08;MICCAI2019&#xff09;&#xff0c;SSL4MIS&#xff08;MICCAI2021&#xff09;&#xff0c;UG-MCL&#xff08;AIIM2022&#xff09;. Uncertainty-aware Self-ensembling Model for Semi-supervise…

3-网络初识-协议

1.概念 协议&#xff0c;网络协议的简称&#xff0c;网络协议是网络通信&#xff08;即网络数据传输&#xff09;经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。通常由三…

Android系统中的Binder通信机制分析(6)- Binder通信机制详解

声明 其实对于Android系统Binder通信的机制早就有分析的想法&#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的&#xff0c;但因为我个人问题没能实施这个计划&#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容&#xff0c;可能涉及的比较多先不具…

SER5 5500U 黑苹果系统安装教程

注意事项&#xff1a; 安装黑苹果系统需要一定的技术和操作经验&#xff0c;而且存在一定的风险&#xff0c;安装前请注意备硬盘内的数据&#xff0c;以免数据丢失&#xff0c;不推荐普通用户进行尝试&#xff0c;本系统及引导由黑果小兵独家制作&#xff0c;更多黑苹果教程百度…

安装CHATGPT保姆级教程(windows版)

ai包链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tKuG4OfkewlDRU292vx8mw?pwdtw8t 提取码&#xff1a;tw8t 一、安装篇 安装python&#xff0c;使用软件包中的python安装程序安装后检查是否安装成功&#xff0c;cmd窗口运行命令&#xff1a; python –vers…

【九章斩题录】C/C++:替换空格(JZ5)

精品题解 &#x1f525; 《九章斩题录》 &#x1f448; 猛戳订阅 &#x1f4dc; 目录&#xff1a; JZ5 - 替换空格 「 法一 」暴力美学 「 法二 」另开数组 「 法三 」反向替换&#xff08;利用 rfind replace&#xff09; 「 整活 」不用C&#xff0c;Python 一行代码搞…

C#基本语法

关键字 标识符命名规则 标识符中只能出现英文字母、数字、下划线&#xff0c;以及这几种字符&#xff0c;不能出现诸如"空格&#xff0c;&#xff01;"等这些字符&#xff1b;标识符名称只能以下划线&#xff0c;字母以及打头&#xff0c;不可以用数字作为标识符名…

企业如何运用CRM实现企业数字化战略布局

随着数字化时代的到来&#xff0c;越来越多的企业开始意识到数字化转型的重要性&#xff0c;而CRM&#xff08;客户关系管理&#xff09;系统则是企业数字化战略布局中的重要一环&#xff0c;也逐渐受到越来越多企业的关注。 那么&#xff0c;企业如何运用CRM实现数字化战略布局…

自动化测试实战(一)12306火车票网站自动登录工具

还记得2011年春运&#xff0c;12306火车票预订网站经常崩溃无法登录吗。 今天我们就开发一个12306网站自动登录软件。 帮助您轻松订票 Web的原理就是&#xff0c;浏览器发送一个Request给Web服务器&#xff0c;Web服务器处理完这个请求之后发送一个HTTP Response给浏览器。 如…

Mybatis源码细节探究:MappedStatement和Cache对象对照关系研究

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

《面试1v1》类加载过程

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你了解Java的类加载过程吗?跟我聊聊classes是如何加载到JVM中的。 候选人&#xff1a; Java的类加载过程由加载、验证、准备、解析和初始化5个…

5月底了,现在不想着跳槽可就晚了

前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在已经5月底了&#xff0c;具体金九银十只剩下三个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出来了…

五、常用提升物体的方式

机器人在运动中伸展和提升功能&#xff0c;历来是比赛中机器人的一个重要的性能指标&#xff0c;因为按 比赛要求&#xff0c;机器人在上场前必须经过体积大小的检测&#xff0c;而在场地中如果能够有更好的伸展性 能将对比赛成绩十分有利&#xff0c;因此机器人提升自身高度以…

SAP-MM发票校验容差详解

MIRO发票校验容差详解 MIRO发票校验容差是指收货业务与发票校验业务之间的差异&#xff0c;这种差异可 能是物料价格差异、收货数量差异、收货金额差异等等&#xff0c;总之&#xff0c;发票校验的容差 内容最为丰富&#xff0c;容差类型有很多种&#xff0c;如下表所示&…

【ChatGPT插件第一期】28个ChatGPT插件,让你的学习、工作、生活效率翻倍!

文章目录 人工智能福利文章什么是ChatGPT插件如何使用ChatGPT插件28个插件全解读写在最后 人工智能福利文章 【分享几个国内免费可用的ChatGPT镜像】【10几个类ChatGPT国内AI大模型】【用《文心一言》1分钟写一篇博客简直yyds】【用讯飞星火大模型1分钟写一个精美的PPT】 Cha…

Linux I2C驱动分析4 - GPIO模拟I2C

一. 前言 在嵌入式开发中&#xff0c;由于芯片的I2C接口有限&#xff0c;或者出于硬件画板的方便&#xff0c;我们都需要将普通的GPIO模拟I2C接口使用。出于对这样的需求&#xff0c;Linux-2.6.x已经有相关代码了&#xff0c;Linux-3.x有标准的内核选项支持该功能&#xff0c;内…

模特信息管理系统的开发与实现(ASP.NET,SQLServer)

需求分析 模特信息管理系统主要给商家和模特用户提供服务&#xff0c;系统分为前台和后台两部分。 本研究课题重点主要包括&#xff1a;活动管理&#xff0c;商家管理&#xff0c;模特管理&#xff0c;系统公告管理和活动报名管理。 活动管理模块主要实现活动更新、活动添加、活…

生鲜农产品冷链物流配送路径优化模型构建及算法实现

摘要&#xff1a;本案例讲述的案例为生鲜农产品冷链物流配送路径优化&#xff0c;涉及的目标函数成本包括碳排放成本、固定成本、运输成本、货损变质成本、时间惩罚成本。 目标种类&#xff1a;单目标模型。 求解方法&#xff1a;基础版蚁群算法改进版蚁群算法。 整体对标层…

快速掌握EasyExcel在web场景中的应用(读和写)

目录 一、引入依赖 二、设置表头 三、web下载模板 四、测试下载功能 五、复杂表头 六、写入数据 七、格式优化 7.1 日期自定义转换 7.2 列宽行高注解 八、动态表头 九、动态表格写入数据 一、引入依赖 <dependency><groupId>com.alibaba</groupId>…

Linux——生产者消费者模型和信号量

目录​​​​​​​ 基于BlockingQueue的生产者消费者模型 概念 条件变量的第二个参数的作用 锁的作用 生产者消费者模型的高效性 生产者而言&#xff0c;向blockqueue里面放置任务 消费者而言&#xff0c;从blockqueue里面拿取任务&#xff1a; 总结 完整代码(不含存储…