首页 > 其他分享 >ACwing——我在哪?

ACwing——我在哪?

时间:2023-02-24 23:24:08浏览次数:30  
标签:子串 int mid ++ 邮箱 include ACwing

题目描述
农夫约翰出门沿着马路散步,但是他现在发现自己可能迷路了!

沿路有一排共 N 个农场。

不幸的是农场并没有编号,这使得约翰难以分辨他在这条路上所处的位置。

然而,每个农场都沿路设有一个彩色的邮箱,所以约翰希望能够通过查看最近的几个邮箱的颜色来唯一确定他所在的位置。

每个邮箱的颜色用 A..Z 之间的一个字母来指定,所以沿着道路的 N 个邮箱的序列可以用一个长为 N 的由字母 A..Z 组成的字符串来表示。

某些邮箱可能会有相同的颜色。

约翰想要知道最小的 K 的值,使得他查看任意连续 K 个邮箱序列,他都可以唯一确定这一序列在道路上的位置。

例如,假设沿路的邮箱序列为 ABCDABC 。

约翰不能令 K=3,因为如果他看到了 ABC,则沿路有两个这一连续颜色序列可能所在的位置。

最小可行的 K 的值为 K=4,因为如果他查看任意连续 4 个邮箱,那么可得到的连续颜色序列可以唯一确定他在道路上的位置。

算法1-暴力枚举

找到长度最小的不重复子串即可

#include<iostream>

using namespace std;

int n;
string s;

int main()
{
    cin >> n >> s;
  //k为子串的最大长度,找出满足条件k的最小值 for(int k = 1;k <= n;k++) { bool flag = false;
    //遍历是否存在相同的子串,如果不存在,即为答案 for(int i = 0;i+k-1 < n;i++) { for(int j = i + 1;j + k -1 < n;j++) { bool same = true; for(int u = 0;u < k;u++) { if (s[i+u] != s[j+u]) { same = false; } } if (same) { flag = true; } } if (flag) break; } if (!flag) { cout << k << endl; break; } } return 0; }

2.二分+哈希

利用stl中的unordered_set来实现查找是否存在相同子串



#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>

using namespace std;

int n;
string str;
unordered_set<string> S;

bool check(int mid)
{
    S.clear();
    for (int i = 0; i + mid - 1 < n; i ++ )
    {
        string s = str.substr(i, mid);
        if (S.count(s)) return false;
        S.insert(s);
    }

    return true;
}

int main()
{
    cin >> n >> str;

    int l = 1, r = n;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }

    cout << r << endl;

    return 0;
}


 

 

标签:子串,int,mid,++,邮箱,include,ACwing
From: https://www.cnblogs.com/polang19/p/17153505.html

相关文章

  • 「AcWing学习记录」KMP
    AcWing831.KMP字符串原题链接1.暴力算法怎么做chars[N],p[M];for(inti=1;i+m-1<=n;i++){boolflag=true;for(intj=1;j<=m;j++)......
  • Acwing 97
    Acwing97.约数之和题意求\(a^b\)的约数之和思路假设不考虑次方,只求a的约数之和,要怎么求呢?当遇到一个数b能被a整除时,假设当前答案为\(ans\),则应再加上\(ans*b\)。a......
  • Acwing 22
    classSolution{public:intfunc(vector<int>&nums,intbegin,intend){while(begin+1<end){intmid=begin+((end-begin)>>1);......
  • 2023.2.23AcWing蓝桥杯集训·每日一题
    今天练习的思维为递推。AcWing3777.砖块题目描述\(n\)个砖块排成一排,从左到右编号依次为\(1∼n\)。每个砖块要么是黑色的,要么是白色的。现在你可以进行以下操作若......
  • AcWing356/洛谷P4180 次小生成树
    涉及知识点:最小生成树,倍增题意题目链接(洛谷)题目链接(AcWing)题目写的很清楚,给定一张N个点M条边的无向图,求无向图的严格次小生成树。设最小生成树的边权之和为sum,严格次......
  • 2023.2.22AcWing蓝桥杯集训·每日一题
    知识点为双指针。AcWing1238.日志统计(蓝桥杯辅导课)题目描述小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有\(N\)行。其中每一行的格式是:tsid......
  • acwing 笨拙的手指
    题目奶牛贝茜正在学习如何在不同进制之间转换数字。但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔。每当贝茜将数字转换为一个新的进制并写下结果时,她总是将其中的......
  • acwing 亲戚
    题目或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整的家谱,判断两个人是否是亲戚应该是可行的,但如果两个......
  • acwing 合并集合
    题目一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:Mab,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个......
  • 2023.2.21AcWing蓝桥杯集训·每日一题
    知识点为二分。AcWing113.特殊排序题目描述有\(N\)个元素,编号\(1,2..N\),每一对元素之间的大小关系是确定的,关系具有反对称性,但不具有传递性。注意:不存在两个元素大......