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".
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }