【t011】最小覆盖子串
Time Limit: 1 second
Memory Limit: 32 MB
【问题描述】
给定一个含有N个元素的序列A,你的任务就是求出序列A的最小覆盖子串的长度。
本题中的一些定义:
串S,是由零个或多个元素组成的序列,其下标从1开始计数。Si 表示串 S 中第 i 个位置的元素值,串的长度N指的是串中元素的个数。
串中任意连续(非空)个元素组成的序列称为该串的子串。子串可以表示成S’:Si,…,Sj,1≤i≤j≤N。
如果子串 S’ 中的不同元素值个数与原串 S 中的不同元素值个数相同,我们称子串 S’ 为原串 S 的覆盖子串,长度最小的覆盖子串称之为原串的最小覆盖子串,我们的任务就是求出最小覆盖子串的长度。
【输入格式】
输入数据的第一行为一个整数N,表示序列中有N个整数(1≤ N ≤1,000,000),序列中不同元素值的个数不超过100,000。第二行有N个整数A1,…,An。
0≤ Ai ≤ 1,000,000,000 1≤i≤N
【输出格式】
输出一行一个整数L,表示给定序列的最小覆盖子串的长度。
【输入样例1】
5
1 8 8 8 1
【输出样例1】
2
【输入样例2】
11
5 1 5 3 2 6 3 8 4 2 5
【输出样例2】
8
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t011
【题意】
【题解】
/*
维护一个队列;
先把第一个元素加入队列;
对于新读入的元素;
看看是不是和头节点相同;
如果和头节点相同
则把头结点去掉;
然后头结点指向下一个值;
然后如果该值在这个队列中出现了多次;>1
则继续递增头结点;
如果队列中不同的元素个数和原序列相同了就尝试更新答案;
*/
【完整代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1e6+100;
int a[N],n,head,tail,tot,dl[N],now ,ans;
map <int, int> dic1,dic2;
void in()
{
rei(n);
rep1(i, 1, n)
{
rei(a[i]);
if (!dic1[a[i]])
{
dic1[a[i]] = 1;
tot++;
}
}
}
void ga()
{
ans = N;
head = tail = 1;
dic2[a[1]] = 1,dl[1] = a[1];
now = 1;
if (now == tot)
ans = min(ans, 1);
rep1(i, 2, n)
{
dl[++tail] = a[i];
if (!dic2[a[i]])
{
dic2[a[i]] = 1;
now++;
}
else
dic2[a[i]]++;
while (dic2[dl[head]] > 1)
{
dic2[dl[head]]--;
head++;
}
if (now == tot)
{
ans = min(ans, tail - head + 1);
}
}
}
void out()
{
printf("%d\n", ans);
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
in();
ga();
out();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【t011】最小覆盖子串的更多相关文章
- POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...
- KMP算法 - 求最小覆盖子串
KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...
- 【1】【leetcode-76】 最小覆盖子串
最小覆盖子串(hard) (不会) 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", ...
- Milking Grid POJ - 2185 || 最小覆盖子串
Milking Grid POJ - 2185 最小覆盖子串: 最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next[n](n-pre[n]),n为串长. 当n%(n-next[n])==0时 ...
- Leetcode 76.最小覆盖子串
最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...
- [LeetCode] 76. 最小覆盖子串 ☆☆☆☆☆(滑动窗口)
https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong- ...
- Java实现 LeetCode 76 最小覆盖子串
76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = ...
- [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)
题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...
- 【LeetCode】76. 最小覆盖子串
76. 最小覆盖子串 知识点:字符串:滑动窗口 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ...
随机推荐
- 【Struts2三】拦截器
拦截器:就是在訪问action之前.对其进行拦截!能够在拦截器中做一些逻辑的处理! 比方权限验证.没有权限就不给予訪问! 拦截器等效于servlet中的过滤器! 使用拦截器步骤: 1.定义自己的拦截器 ...
- IOS蓝牙项目总结
常见的蓝牙标准有2.0和4.0. 特点 2.0 1.适用于数据量比较大得传输,比如音乐.语音2.IOS开发中,要求设备是经过MFI认证 4.0 1.适用于实时性比较高的数据传输,比如遥控类的鼠标. ...
- 9.6 Binder系统_驱动情景分析_server的多线程实现
当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...
- OC学习篇之---类的定义
OC中类的相关知识 OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言 ...
- Shiro的Filter机制详解---源码分析(转)
Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...
- ScrollView ViewPager ListView三者共存的问题
随喜结佛缘 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVueWluZw==/font/5a6L5L2T/fontsize/400/fill/ ...
- HDU 1425 sort hash+加速输入
http://acm.hdu.edu.cn/showproblem.php?pid=1425 题目大意: 给你n个整数,请按从大到小的顺序输出其中前m大的数. 其中n和m都是位于[-500000,50 ...
- HDU 1213 How Many Tables 并查集 水~
http://acm.hdu.edu.cn/showproblem.php?pid=1213 果然是需要我陪跑T T,禽兽工作人员还不让,哼,但还是陪跑了~ 啊,还有呀,明天校运会终于不用去了~耶耶耶 ...
- Android入门——Bitmap和BitmapFactory
我们都知道一个App的成败,首先取决于是否具有优秀的UI,而除了交互功能之外还需要丰富的图片背景和动画去支撑.在开发中我们应用到的图片不仅仅包括.png..gif..9.png..jpg和各种Draw ...
- EntityFrameworkCore 中的 Attach 方法
Attach 的坑 Model Filed Database Value Console Value User Phone +123000000000 +12333333333 User Email ...