HDU 4455 Substrings

第37届ACM/ICPC杭州现场赛C题

DP经典。

思路:

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 #include<math.h>
 6 #include<algorithm>
 7 
 8 #define repA(p,q,i)  for(int (i)=(p); (i)!=(q); ++(i) )
 9 #define repD(p,q,i)  for(int (i)=(p); (i)!=(q); --(i) )
10 #define repAE(p,q,i)  for(int (i)=(p); (i)<=(q); ++(i) )
11 #define repDE(p,q,i)  for(int (i)=(p); (i)>=(q); --(i) )
12 #define range 1000010
13 
14 int a[range];
15 int loc[range];
16 int dis[range];
17 int last[range];
18 long long query[range];
19 int n;
20 
21 int main()
22 {
23     while(scanf("%d",&n) != EOF)
24     {
25         if(n==0)  break;
26         repAE(1,n,i)
27           scanf("%d",&a[i]);
28         repA(0,range,i)
29           dis[i]=loc[i]=0;
30         repAE(1,n,i)
31         {
32             ++dis[i - loc[ a[i] ] ] ;
33             loc[a[i] ] = i ;
34         }
35 
36         repA(0,range,i)
37           loc[i] = 0;
38         last[0]=0;
39         repAE(1,n,i)
40         {
41             if( loc[a[n-i+1] ] == 0 )
42             {
43                 last[i]=last[i-1] + 1;
44                 loc[a[n-i+1] ]=1;
45             }
46             else
47                 last[i]=last[i-1];
48         }
49         
50         query[0]=0;
51         int num=n;
52         repAE(1,n,i)
53         {
54             num -= dis[i-1];
55             query[i] = query[i-1] + num ;
56             query[i] -= last[i-1];
57         }
58 
59         int q,id;
60         scanf("%d",&q);
61         while(q--)
62         {
63             scanf("%d",&id);
64             cout<<query[id]<<endl;
65         }
66     }
67     return 0;
68 }
View Code

 

posted on 2013-10-15 13:32  码农之上~  阅读(134)  评论(0编辑  收藏  举报

导航