Cpp环境【Uva11572】【Vijos2788】唯一的雪花(并没有雪花=_=)
2016-07-18 17:36
260 查看
【问题描述】
输入一个长度为n(n<=10^6)的序列A,找一个尽量长的连续子序列A[L]..A[R],使得序列中没有相同的元素。
【输入格式】
第一行一个整数n,表示序列A长度,接下来的N行,按顺序给出序列A[1]..A
,每行一个整数数,表示序列的元素。
【输出格式】
没有重复元素的连续序列最长长度。
【输入样例】
5
1
2
3
2
1
【输出样例】
3
【数据范围】
1<=n<=10^6 , 0<=A[i]<=10^9
【思路梳理】
典型的滑动窗口问题,但是这个窗口和经典模型不同,后者长度固定,而前者则恰好相反,长度不定且正是我们需要所求的答案。和经典的滑动窗口一样,还是模拟,这里我们可以考虑使用STL容器的map映射,也就是常说的“超级数组”,将每一个元素的值映射到它在map中出现的次数,每一次滑动窗口,若mp[a[R]]<1则直接加入这个元素,否则就将L不断向右移动直到mp[a[R]]=1(也就是说另外一个a[R]已经在L的左边),操作完毕之后计算一下L-R+1的大小即可。
【Cpp代码】
#include<map> #include<iostream> #define maxn 1000005 using namespace std; int a[maxn]; map<int,int>mp; map<int,int>::iterator it; int L,R,n,ans=0; int main() { mp.clear(); //freopen("in.txt","r",stdin); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; L=R=1;ans=1; for(R=1;R<=n;R++) { mp[a[R]]++;//a[R]出现的次数增加1 while(mp[a[R]]>1) mp[a[L++]]--;//当a[R]出现了多于一次的时候不断地把滑动窗口的左下标右移 ans=max(ans,R-L+1);//注意滑动窗口的长度等于右下标减去左下标再加一 } cout<<ans; return 0; }
相关文章推荐
- jQuery实现仿微软首页感应鼠标变化滑动窗口效果
- TCP/IP滑动窗口
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research