嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法
嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法
题意
给你一串数,让你求长度最长的子串,这个字串满足里面没有重复出现的数字。
解题思路
使用一个标记数组,来标记每个数的第一次出现的位置,然后进行下面的模拟,详细看代码实现吧。
自己当时憨憨,没有想到需要进行离散化,第一次提交后返回Runtime Error后立刻意识到需要进心离散化,但是没时间了,哎,太可惜了。当然做这道题时,自己思路也不是很清晰,导致Debug了好长时间。
后来想了想,这个思路不就是使用尺取嘛。
代码实现
//尺取,代码更加简洁
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 1e6+7;
int num[maxn];
map<int, int> mp;
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
int ans = 0, l=1;
mp.clear();
for (int i = 1; i <= n; i++)
scanf("%d", &num[i]);
for (int r = 1; r <= n; r++)
{
mp[num[r]]++;
while(mp[num[r]] > 1)
{
mp[num[l]]--;
l++;
}
ans = max(r - l +1, ans);
}
printf("%d\n", ans);
}
return 0;
}
//这个是自己思路清晰后写的代码,思路将相当与两个指针
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1e6+7;
vector<int> v;
int a[maxn], vis[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
while(!v.empty()) v.pop_back() ; //清空上次的数据
for(int i=1; i<=n; i++)
vis[i]=0; //初始化
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
v.push_back(a[i]);
}
sort(v.begin() , v.end() );
v.erase(unique(v.begin() , v.end() ), v.end() ); //这行和上一行是进行离散化
for(int i=1; i<=n; i++)
{
a[i]=lower_bound(v.begin() , v.end() , a[i])-v.begin()+1;
if(vis[a[i]]==0)//这里只记录第一次数字出现的位置
vis[a[i]]=i;
}
int i, begin=1, ans=0;//begin相当于左指针
for(i=1; i<=n; i++)//这里的i相当于右指针
{
if(vis[a[i]]!=i)
{
if(vis[a[i]] < begin) //如果第一次出现的位置,小于左指针指向的位置,那么就可以直接更改标记数组就行了,这里可以用笔和纸模拟一下就可以了。
{
vis[a[i]]=i;
}
else
{
ans=max(ans, i-begin); //i-begin是长度
begin=vis[a[i]]+1;//更改左边的位置
vis[a[i]]=i; //更改标记数组
}
}
}
ans=max(ans, i-begin); //这里最后一次也需要进行判断一次
printf("%d\n", ans);
}
return 0;
}
//这里加了离散化就过来,还是自己太菜了!
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
int a[maxn];
int vis[maxn];
vector<int> v;
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
while(!v.empty()) v.pop_back() ;
for(int i=1; i<maxn; i++)
vis[i]=0;
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
v.push_back(a[i]);
}
sort(v.begin(), v.end());
v.erase( unique(v.begin(), v.end() ), v.end() );
for(int i=1; i<=n; i++)
{
int tmp=lower_bound(v.begin(), v.end() , a[i]) - v.begin() +1;
a[i]=tmp;
if(vis[tmp]==0)
vis[tmp]=i;
}
int ans=0, tmp=0, begin=1, flag=0;
for(int i=1; i<=n; i++)
{
flag=0;
if(vis[a[i]]!=i && vis[a[i]]!=0)
{
if(vis[a[i]]>=begin)
{
ans=max(tmp, ans);
tmp++;
if(vis[a[i]]==begin)
tmp=tmp-1;
else
tmp=tmp-vis[a[i]]+begin-1;
begin=vis[a[i]]+1;
flag=1;
}
vis[a[i]]=i;
if(flag==0)
tmp++;
}
else{
tmp++;
}
}
ans=max(ans, tmp);
printf("%d\n", ans);
}
return 0;
}
嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法的更多相关文章
- cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色
卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- Vijos1901 学姐的钱包
描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位 ...
- cdoj 1329 卿学姐与魔法 优先队列
卿学姐与魔法 Time Limit: 1200/800MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- cdoj 1324 卿学姐与公主 线段树裸题
卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- vijosP1903学姐的实习工资
描述 学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.因为学姐很厉害, 所以V[1..N]是不下降的.也就是说学姐每天的工资只会越来越多, 不 ...
- vijos1891 学姐的逛街计划(线性规划)
P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...
- UESTC - 1324 卿学姐与公主
题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...
- ATP学姐的模拟赛
ATPの水题大赛 声明:不是我觉得这题水,这就是本场模拟赛的名称. T1:求所有的$n$位数中有几个数满足:每一位要么是$A$要么是$B$,并且这个$n$位数的每一位加起来是$A$或$B$的倍数. $ ...
随机推荐
- 由于代码环境有dev test prod ,每次提交代码需要很多环境,shell脚本即可解决重复命令问题
在项目外面写入push.sh 内容为 if [ $1!='' ] then msg=$1; else msg='bug'; fi git add . git commit -m $ ...
- 【Spring】Spring-Session-Data-Redis实现session共享
前言 在开发中遇到一个关于用户体验的问题,每次当运维进行更新重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session来保存的,而session对象是由服务 ...
- PHP技术分享-起始时间戳和结束时间戳的方法
php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime.下面兄弟连PHP培训 首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日 ...
- Qt第三方库----QCustomPlot
一.软件下载 下载地址:http://www.qcustomplot.com/index.php/download 这里推荐下载第一个链接的内容: 注:这里的第三方库要放在非中文目录下. 二.配置 ( ...
- 【canvas学习笔记三】样式和颜色
上一节我们学习了如何用路径绘制各种形状,但我们只能用默认的颜色和线条.这节就来学习设置不同的颜色和线条样式. 颜色 设置颜色主要有两个属性: fillStyle = color 设置填充颜色 stro ...
- 大v用户数据统计分析
1,统计数据的基本情况,包括微博总数,用户总数,最活跃和最不活跃的用户id #!/bin/sh source_dir=/home/minelab/data/DATA source_file_name= ...
- 使用mysql以及连接数据库
MySQL Table of Contents 1. 安装与配置 2. 数据库与账户 3. 用户跟权限 4. 常用命令 5. 表的创建 6. 数据类型 7. 主键约束 8. 表的修改 9. 引擎(En ...
- vue递归组件的实现
本文链接:https://blog.csdn.net/weixin_43756060/article/details/87786344vue递归实现图片上的多级菜单 父级组件结构 <templa ...
- Mybaits多个参数的传递
今天介绍是多个参数传递到映射xml,进行CURD操作 一.使用参数映射的方法进行传递 1在接口写对应的方法 public interface EmployeeMapper { public Emplo ...
- CentOS7 下 Zabbix3.4 源码安装
zabbix系统基于PHP环境运行,所以前提是系统上有PHP的运行环境,lnmp或者lamp环境 lnmp环境安装:http://www.cnblogs.com/rnckty/p/7642034.ht ...