HDU 4749 Parade Show 2013 ACM/ICPC Asia Regional Nanjing Online
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749
题目大意:给一个原序列N,再给出一个序列M,问从N中一共可以找出多少个长度为m的序列,序列中的数的相对大小关系与序列M中相对大小关系相同。(序列之间不能重叠)
解题思路:从头开始以i为起点暴搜,不断找长度为m的序列,判断是否满足条件。若满足,跳到i+m之后继续搜,若不满足,向后移一位继续搜。
判断方法压缩数据比较相对大小。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int N[100005],M[100005]; 6 int n,m,k,all; 7 int to[26],y[26]; 8 bool judge(int start) 9 { 10 memset(to,0,sizeof(to)); 11 memset(y,0,sizeof(y)); 12 int i,j,l,MM; 13 MM=0; 14 for(i=start,j=0;i<m+start;i++,j++) 15 { 16 if(to[N[i]]==0&&y[M[j]]==0) 17 { 18 to[N[i]]=M[j]; 19 y[M[j]]=N[i]; 20 if(MM<M[j])MM=M[j]; 21 for(l=M[j]-1;l>=0;l--) 22 { 23 if(y[l]){ 24 if(y[l]>N[i]) 25 { 26 return false; 27 } 28 break; 29 } 30 } 31 for(l=M[j]+1;l<=MM;l++) 32 { 33 if(y[l]) 34 { 35 if(y[l]<N[i]) 36 return false; 37 break; 38 } 39 } 40 } 41 else 42 { 43 if(!y[M[j]]||!to[N[i]]) 44 return false; 45 if(N[i]!=y[M[j]]||M[j]!=to[N[i]]) 46 return false; 47 } 48 } 49 return true; 50 } 51 int main() 52 { 53 int i; 54 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 55 { 56 all=0; 57 for(i=0;i<n;i++) 58 scanf("%d",&N[i]); 59 for(i=0;i<m;i++) 60 scanf("%d",&M[i]); 61 for(i=0;i<=n-m;i++) 62 { 63 if(judge(i)) 64 { 65 all++; 66 i+=m-1; 67 } 68 } 69 printf("%d\n",all); 70 } 71 return 0; 72 }