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 }
To Be The Best Of Yourself