AcWing 799. 最长连续不重复子序列
原题链接
简单
作者:
长空孤月
,
2020-03-05 23:43:48
,
所有人可见
,
阅读 570
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e5+10;
int s[N]={0}, h[N]={0}; //数值范围和数据量范围都是10w
int main(){
int n, count = 0;
cin >> n;
for(int i = 1; i <= n; i++) cin >> s[i];
//l, r 分别记录当前合法子串左右位置
for(int r = 1, l = 1; r <= n; ++r){ //维护新出现字符的上次出现位置不在子串内,h数组更新字符最后一次出现的位置
if(h[s[r]] == 0 || l > h[s[r]])// 新字符未出现或出现了但未在区间内(左边界左侧)
//注意这里用位置是否为0作为是否出现的依据,因此必须从1开始存
count = max(count, r - l +1);
else
l = h[s[r]] + 1; //子串内出现,更新左边界
h[s[r]] = r; //更新该数值的位置
}
// for(int r = 1, l = 1; r <= n; r++){ //维护区间内字符只出现一次,h数组保存次数
// h[s[r]] ++;
// while( h[ s[r] ] > 1)
// h[ s[l++] ] -- ; //移动左边界,直到区间无重复字符
// count = max(count, r - l + 1);//
// }
cout << count;
return 0;
}