题意:求长度为N的序列中,最长的一个无重复元素的连续子序列。
解法:[L,R]每次R++或L++延伸就可以得到答案。
实现:(1)next[],last[]——O(n);
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N (int)1e6+10 8 9 struct node{ int x,d,t;}a[N],b[N];10 int hou[N],last[N];11 int n,m,i,j,k;12 13 bool cmp(node x,node y) { return x.x y?x:y;}15 void input()16 {17 scanf("%d",&n);18 for (i=1;i<=n;i++)19 {20 scanf("%d",&a[i].x);21 a[i].t=i;22 }23 }24 void init()25 {26 memcpy(b,a,sizeof(a));27 sort(b+1,b+1+n,cmp);28 m=1,a[b[1].t].d=m;29 for (i=2;i<=n;i++)30 {31 if (b[i].x!=b[m].x) b[++m]=b[i];32 a[b[i].t].d=m;33 }34 memset(hou,-1,sizeof(hou));35 for (int i=1;i<=n;i++)36 {37 last[i]=hou[a[i].d];38 hou[a[i].d]=i;39 }40 }41 int solve()42 {43 int l=1,r=1,ans=0;44 while (r<=n)45 {46 while (r<=n&&last[r]
(2)set.insert(),count(),erase()——O(nlogn);
1 #include2 #include 3 #include 4 using namespace std; 5 const int maxn = 1000000 + 5; 6 int A[maxn]; 7 int main( ) { 8 int T, n; 9 scanf("%d", &T);10 while(T--) {11 scanf("%d", &n);12 for(int i = 0; i < n; i++) scanf("%d", &A[i]);13 set s;14 int L = 0, R = 0, ans = 0;15 while(R < n) {16 while(R < n && !s.count(A[R])) s.insert(A[R++]);17 ans = max(ans, R - L);18 s.erase(A[L++]);}19 printf("%d\n", ans);20 }21 return 0;22 }
(3)map.clear(),count()——O(nlogn)。
1 #include2 #include