CodeForces 701C They Are Everywhere 尺取法

简单的尺取法……

先找到右边界 然后在已经有了所有字母后减小左边界……

不断优化最短区间就好了~

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define M(a,b) memset(a,b,sizeof(a))
 4 char a[200005];
 5 int zimu[205];
 6 int zimu1[205];
 7 bool in[205];
 8 int sum;
 9 int main(){
10     int n;
11     while(~scanf("%d",&n)){
12         getchar();
13         M(zimu,0);
14         M(in,false);
15         gets(a);
16         sum=0;
17         int minx=1000005;
18         for(int i=0;i<n;i++){
19             if(!in[a[i]-'A']){
20                 in[a[i]-'A']=true;
21                 sum++;
22             }
23         }
24         M(in,false);
25         int l=0,r=0,num=0;
26         while(r<n){
27             zimu[a[r]-'A']++;
28             if(!in[a[r]-'A']){
29                 in[a[r]-'A']=true;
30                 num++;
31             }
32             if(sum==num){
33                 while(true){
34                     if(zimu[a[l]-'A']==1) break;
35                     else zimu[a[l]-'A']--;
36                     l++;  //在这里T了一发
37                 }
38                 if(r-l+1<minx) minx=r-l+1;
39             }
40             r++;
41         }
42         printf("%d\n",minx);
43     }
44     return 0;
45 }
46 /*
47 
48 3
49 AaA
50 7
51 bcAAcbc
52 6
53 aaBCCe
54 
55 
56 */

 

posted @ 2016-08-08 23:11  良将ℓ  阅读(273)  评论(0编辑  收藏  举报