R7-13 小明找前缀100000(假)

news2024/11/28 20:53:31

题目背景

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

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

现在老师给了小明 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方向搜索

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

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

相关文章

关于Vue3 ,看这一篇文档你就会用了

随着Vue3的到来&#xff0c;公司的新项目全部进行了升级&#xff0c;相比于Vue2&#xff0c;语法上个人觉得更简洁&#xff0c;更容易通俗易懂。首先安装vue3项目&#xff0c;这里我使用vite进行安装&#xff08;强烈推荐&#xff0c;启动速度贼快&#xff09; npm create vit…

Android 12.0状态栏居中显示时间和修改时间显示样式

1.概述 在12.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 在这里插入图片描述 …

算法基础学习笔记——⑩DFS与BFS\树与图

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 DFS与BFS\树与图 ✨DFS ✨BFS &#x1f353;宽搜流程图如下&#xff1a; &#x1f353;宽搜流程&#xff1a; &#x1f353;广搜模板 ✨树与图 &#x1f353;树是特殊的图&#xff08;连通无环的图&am…

第09讲:SkyWalking Agent 启动流程剖析,领略微内核架构之美

微内核架构 SkyWalking Agent 采用了微内核架构&#xff08;Microkernel Architecture&#xff09;&#xff0c;那什么是微内核架构呢&#xff1f;微内核架构也被称为插件化架构&#xff08;Plug-in Architecture&#xff09;&#xff0c;是一种面向功能进行拆分的可扩展性架构…

英文论文(sci)解读复现【NO.8】基于注意机制和感受野的YOLOv5在唐卡图像缺陷识别中的应用

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

【Unity100个实用小技巧】世界Canvas自动隐藏,包含子物体

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#…

【JavaEE】JUC(java.util.concurrent)的常见类以及线程安全的集合类

目录 1、JUC&#xff08;java.util.concurrent&#xff09;的常见类 1.1、Callable接口的用法&#xff08;创建线程的一种写法&#xff09; 1.2、ReentrantLock可重入互斥锁 1.2.1、ReentrantLock和synchronized的区别 1.2.2、如何选择使用哪个锁 1.3、Semaphore信号量 1…

pta(浙大第四版)五道经典练习题③

目录 ①7-4 IP地址转换 ②、查找日期 ③藏头词 四、IP地址转换 五、删除链表值为偶数的节点 ①7-4 IP地址转换 题述&#xff1a;IP地址转换&#xff1a;一个IP地址是用四个字节&#xff08;每个字节8个位&#xff09;的二进制码组成。输入32位二进制字符串&#xff0c;输…

探索iOS转场动画

iOS提供图像转场动画&#xff0c;可实现酷炫的转场特效。动画包括&#xff1a;溶解、折叠、复印机、暴露、翻页、波纹、滑动等等。 一、溶解动画 CIDissolveTransition提供溶解动画&#xff0c;我们来看看对应的转场动画效果&#xff1a; 在CIFilter指定CIDissolveTransition…

Qt线程基础,多线程使用注意点,目前支持的线程种类。

Qt线程基础 一、什么是线程&#xff1f;二、GUI线程和工作线程三、同时访问数据四、使用线程1、何时使用线程的替代品2、应该用哪种Qt线程技术&#xff1f; 六、Qt中的多线程技术1、QThread:带有可选事件循环的低级API2、QThreadPool和QRunnable:重用线程 七、Qt Concurrent:使…

集成学习以及随机森林介绍

一、集成学习简介 1.什么是集成学习&#xff1f; 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习方法&#xff0c;通过将多个弱学习器&#xff08;weak learner&#xff09;组合在一起来构建一个更强大的学习器&#xff08;strong learner&#xff09;。 …

C语言进阶——字符函数和字符串函数(下)

在前面我们已经学习了strlen、strcpy、strcat、strcmp几个库函数&#xff0c;今天我们继续学习剩余的库函数。 上期链接&#xff1a; C语言进阶——字符函数和字符串函数&#xff08;上&#xff09;_wangjiushun的博客-CSDN博客 目录&#xff1a; 3、长度受限制的字符串函数…

Redis(四)持久化策略

文章目录 持久化策略1、为什么Redis需要持久化2、Redis提供的两种持久化方式(1)RGB持久化详解概述RGB持久化的两种触发策略手动触发实例测试&#xff1a;自动触发实例测试&#xff1a; 查看rdb的状态信息info Persistence rdb模式的优缺点 (2)AOF持久化详解AOF持久化步骤&#…

近期复盘 | 想多了都是问题,想开了都是答案

文章目录 &#x1f339;四月坚持背单词&#xff0c;五月坚持利用AI写文章&#x1f60a;六月会坚持干什么&#x1f64c;23年7月&#xff1a;毕业两年&#xff0c;参保两年&#x1f440;强制存储&#xff0c;消费降级&#xff0c;开源节流&#x1f61c;好好深耕能力&#x1f381;…

JavaScript 进阶 (一)

目录 作用域 局部作用域 函数作用域 块作用域 全局作用域 作用域链 JS垃圾回收机制 闭包 变量提升 函数进阶 函数提升 函数参数 箭头函数 基本语法 箭头函数参数 箭头函数this 解构赋值 数组解构 对象解构 遍历数组 forEach 方法&#xff08;重点&#xff09; …

shell SNAT与DNAT

文章目录 SNATSNAT原理与应用SNAT实验 DNATDNAT原理与应用DNAT实验 SNAT SNAT原理与应用 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能早Internet中正常路由&#xff09; SNAT原理&#xff1a;修改数据包的源地址。 SNAT转换前提…

文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题

五、V.Pan 发现一种方法&#xff0c;可以用 132 464 次乘法操作完成 68 x 68 的矩阵相乘&#xff0c;发现另一种方法&#xff0c;可以用 143 640 次乘法操作完成 70 x 70 的矩阵相乘&#xff0c;还发现一种方法&#xff0c;可以用155 424次乘法操作完成 72 x 72 的矩阵相乘。当…

数据安全治理科技产品能力-数据安全复合治理框架和模型解读(2)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地数据安全治理科技水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理…

自动驾驶业内动态简讯

1. 引言 参与自动驾驶领域相关研发工作已有多年&#xff0c;针对该领域的快速发展&#xff0c;收集业内各大科技公司最新进展和技术突破&#xff0c;供伙伴们交流探讨。 闲话少说&#xff0c;直接开始吧! 2. 博世 据新闻介绍&#xff0c;博世在德国道路上测试L4级无人驾驶汽…

java 区分缺陷Defects/感染Infections/失败Failure

java 区分缺陷Defects/感染Infections/失败Failure 缺陷Defects 软件故障总是从代码中一个或多个缺陷的执行开始。 缺陷只是一段有缺陷、不正确的代码。 缺陷可能是程序语句的一部分或完整部分&#xff0c;也可能对应于不存在但应该存在的语句。 尽管程序员要对代码中的缺陷负…