嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法

点我进入OJ题目详情

题意

给你一串数,让你求长度最长的子串,这个字串满足里面没有重复出现的数字。

解题思路

使用一个标记数组,来标记每个数的第一次出现的位置,然后进行下面的模拟,详细看代码实现吧。

自己当时憨憨,没有想到需要进行离散化,第一次提交后返回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 模拟 尺度法的更多相关文章

  1. cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色

    卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  2. Vijos1901 学姐的钱包

    描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位 ...

  3. cdoj 1329 卿学姐与魔法 优先队列

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  4. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  5. vijosP1903学姐的实习工资

    描述 学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.因为学姐很厉害, 所以V[1..N]是不下降的.也就是说学姐每天的工资只会越来越多, 不 ...

  6. vijos1891 学姐的逛街计划(线性规划)

    P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...

  7. 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

    美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...

  8. UESTC - 1324 卿学姐与公主

    题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...

  9. ATP学姐的模拟赛

    ATPの水题大赛 声明:不是我觉得这题水,这就是本场模拟赛的名称. T1:求所有的$n$位数中有几个数满足:每一位要么是$A$要么是$B$,并且这个$n$位数的每一位加起来是$A$或$B$的倍数. $ ...

随机推荐

  1. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  2. Python 元组Ⅱ

    删除元组 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例: 以上实例元组被删除后,输出变量会有异常信息,输出如下所示: 元组运算符 与字符串一样,元组之间可以使用 + ...

  3. python 从入门到实践 第三章

    在第3章,你将学习如何在被称为列表的变量中存储信息集,以及如何通过遍历列表来操作其中的信息 写注释 # 代码越长 标识好代码的重要性 越来越重要要求习惯:在代码中编写清晰,简洁的注释开始研究更复杂的主 ...

  4. 4. ClustrixDB CLX命令详解

    Clustrix提供了一个名为clx的实用程序来管理其分布式ClustrixDB数据库. 命令在 /opt/clustrix/bin/ 下面 sudo su - clxm 用户即可使用 clx hel ...

  5. SpringBoot2.2版本配置绑定

    具体可以查看这篇:https://www.cnblogs.com/dalianpai/p/11772382.html  原始的 /** * @author WGR * @create 2019/12/ ...

  6. PCL智能指针疑云 <二> 使用同一智能指针作为PCL预处理API的输入和输出

    问题介绍: slam构建地图,先进行降采样,再进行可视化或存储.然而经过降采样后,代码没有报错的情况下,点云数据散成一团.将代码和点云数据展示如下, pcl::VoxelGrid<Lidar:: ...

  7. week4 作业

    week4 作业 1.定义一个对所有用户都生效的命令别名,例如:lftps='lftp 172.168.0.1 /pub' 在 ~/.bashrc中添加命令: alias = 'rm -i' 2.显示 ...

  8. springboot(一).初识springboot以及基本项目搭建

    初识springboot 以及基本项目搭建 由于新的项目需要搭建后台框架,之前的springmvc架构也使用多次,在我印象中springboot的微服务架构更轻量级更容易搭建,所以想去试试spring ...

  9. es之零停机重新索引数据

    实际生产,对于文档的操作,偶尔会遇到这种问题: 某一个字段的类型不符合后期的业务了,但是当前的索引已经创建了,我们知道es在字段的mapping建立后就不可再次修改mapping的值 比如: 1): ...

  10. 为什么JPA@Modifying需要@Transactional注解

    在JPA开发中遇到一个很奇怪的问题,@Modifying需要和@Transactional配合使用才能正常使用.如下面代码所示 @Modifying @Transactional @Query(&qu ...