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 }
View Code

 

posted @ 2013-09-21 23:37  飞火扑蛾  阅读(491)  评论(0编辑  收藏  举报