hrbust1758

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1758

题意:输入两个字符串S,T,长度小于100000,求出在S中包含T中的最小的那段,例如:
S = "ADOBECODEBANC"
T = "ABC"
答案是  "BANC".

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 const int M=10005;
 4 const int N=100005;
 5 char s1[N],s2[N];
 6 int m1[M],m2[M];
 7 int l1,l2;
 8 int main(){
 9     int i,j;
10     int L,R,len;
11     int kind1,kind2;
12     while(scanf("%s",s1)!=EOF){
13         scanf("%s",s2);
14         l1=strlen(s1);
15         l2=strlen(s2);
16         kind1=kind2=0;
17         memset(m1,0,sizeof(m1));
18         memset(m2,0,sizeof(m2));
19         for(i=0;i<l2;i++){
20             if(!m2[s2[i]]) kind2++;
21             m2[s2[i]]++;
22         }
23         int flag=0;
24         len=N;
25         for(i=j=0;i<l1;i++){
26             if(m2[s1[i]]){
27                 m1[s1[i]]++;
28                 if(m1[s1[i]]==m2[s1[i]]) kind1++;
29                 if(kind1==kind2) flag=1;
30             }
31             while(1){
32                 if(!m2[s1[j]] || (m2[s1[j]]&&m1[s1[j]]>m2[s1[j]])){
33                     m1[s1[j]]--;j++;
34                 }else break;
35             }
36             if(flag)
37             if(i-j+1<len || (i-j+1==len&&j<L)){
38                 L=j;R=i;len=i-j+1;
39             }
40         }
41         if(!flag) printf("");
42         else for(i=L;i<=R;i++) printf("%c",s1[i]);
43         printf("\n");
44     }
45     return 0;
46 }

 

posted @ 2013-05-01 13:37  _sunshine  阅读(237)  评论(0编辑  收藏  举报