hdu 1501(Zipper)

hdu 1501(Zipper)
 1 #include <iostream>
 2 #include <cstring>
 3  using  namespace std;
 4  #define MaxSize 205
 5  char str1[MaxSize],str2[MaxSize],str[MaxSize<<1];
 6  int mark[MaxSize<<1][MaxSize<<1]; // 此题用mark标记一下非常关键!!否则超时
 7  int n,len1,len2,len;
 8  bool isOK;
 9 
10  void dfs( int num1, int last_pos, int num2){
11      // 一号字符串当前需要匹配的位置,上一次一号字符串匹配的位置,二号字符串当前需要匹配的位置
12       int i,j,k;
13      if(isOK)    
14          return;
15      if(mark[num1][num2])
16          return;
17     mark[num1][num2]=1;
18      if(num1>len1){ // 当一号字符串匹配完毕!
19           for(j=last_pos+1,k=num2;j<=len;j++,k++)
20              if(str[j]!=str2[k])     return;
21         isOK= true;     return;
22     }
23      for(i=last_pos+1;i<=len;i++){
24          if(str[i]==str1[num1]){
25              for(j=last_pos+1,k=num2;j<i;j++,k++)
26                  if(str[j]!=str2[k])     return;
27             dfs(num1+1,i,k);    
28         }
29     }
30     
31 }
32 
33  int main(){
34      // freopen("in.txt","r",stdin);
35       int i;
36     scanf("%d",&n);
37     getchar();
38      for(i=1;i<=n;i++){
39         scanf("%s %s %s",str1+1,str2+1,str+1);
40         str1[0]=str2[0]=str[0]='0';
41         len1=strlen(str1)-1;
42         len2=strlen(str2)-1;
43         len=len1+len2;
44         isOK= false;
45         memset(mark,0, sizeof(mark));
46         dfs(1,0,1);
47         printf("Data set %d: ",i);
48          if(isOK)
49             puts("yes");
50          else
51             puts("no");
52 
53     }
54      return 0;
55 }
56 

你可能感兴趣的:(hdu 1501(Zipper))