UVA11572_Unique Snowflakes
2024-09-06 04:07:36
超级经典的题目,扫描区间,滑动窗口
对这题目的最大感受就是,单独看这个题目,其实不难,但是很多我感觉挺难或者没做出来的题目,都是由这些若干个经典的算法组合而成的
滑动窗口便是一个典型的例子!!!!遇到过好几道用到滑动窗口的题目
而本题则赤裸裸的滑动窗口
题意:
输入一个长度为n的序列A,找一个尽可能长的子序列使他们之间无重复元素
思路:
第一步,自己暴力模拟
第二步,找规律,尝试着状态转移
第三步,修正,实现
首先不能重复,那么我们先假设区间[l, r] 无重复元素,那么加入一个元素a[r+1],会出现什么变化呢???
如果原来的区间没有a[r+1]那么新的区间仍然是一个无重复元素的区间,否则的话,移动左边界,一直到使他们没有重复
这题wa了几发,,原因是在循环的时候,边界判断错误
实现的话就用cnt[maxn]来记录区间里面的元素信息,右边界右移cnt[x]++,左边界则是cnt[x]--;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
#include<set>
using namespace std;
const int maxn=1e6+5;
int A[maxn];
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,t;
cin>>t;
while(t--){
cin>>n;
int r,l,ans;ans=l=r=0;
for(int i=0;i<n;i++) cin>>A[i];
set<int>s;
while(r<n){
while(r<n&&!s.count(A[r])) s.insert(A[r++]);
ans=max(ans,r-l);
s.erase(A[l++]);
}
cout<<ans<<endl;
}
return 0;
}
最新文章
- Ubuntu14.04下jdk的安装
- 【POJ】【2096】Collecting Bugs
- Spring(3.2.3) - Beans(10): 生命周期
- sea.js说明文档
- web - float , 浮动
- Javascript之pixi框架学习
- NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列
- 洛谷P1258 小车问题(题解)
- Python开发爆破工具
- Number of subarrays having sum exactly equal to k(explanation for 437. Path Sum III of leetcode)
- digital ocean 内存不足时增加swap文件的方法
- P2731 骑马修栅栏 Riding the Fences
- 【LFM】隐语义模型
- PHP通过__call实现简单的AOP(主事务后的其他操作)比如前置通知,后置通知
- python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)
- tornado部署
- sqlserver,oracle,mysql等的driver驱动,url怎么写
- 初步学习pg_control文件之八
- android开发中,在java中怎样使用c提供过来char*
- api 爬虫 避免相同 input 在信息未更新 情况下 重复请求重复