fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <algorithm>
  4. #include <map>
  5. #include <string>
  6. #include <string.h>
  7. #include <queue>
  8. #include <set>
  9. using namespace std;
  10. int p[26];
  11. int colors[26][100];
  12. pair<int,int> block[200];
  13. int dp[200][200];
  14. pair<int,int> mid[100][2][20];
  15. int mid_sz[100][2];
  16. void inline Add_mid0(int idx,int cnt,int cost)
  17. {
  18. for(int i=0;i<mid_sz[idx][0];i++)
  19. {
  20. if(mid[idx][0][i].first<=cnt)
  21. {
  22. if(cost-cnt>=mid[idx][0][i].second-mid[idx][0][i].first) return;
  23. }
  24. else if(cost-cnt<=mid[idx][0][i].second-mid[idx][0][i].first) {swap(mid[idx][0][i],mid[idx][0][--mid_sz[idx][0]]); i--;}
  25. }
  26. mid[idx][0][mid_sz[idx][0]++]=make_pair(cnt,cost);
  27. }
  28. void inline Add_mid1(int idx,int cnt,int cost)
  29. {
  30. for(int i=0;i<mid_sz[idx][1];i++)
  31. {
  32. if(mid[idx][1][i].first<=cnt)
  33. {
  34. if(cost>=mid[idx][1][i].second) return;
  35. }
  36. else if(mid[idx][1][i].second>=cost) {swap(mid[idx][1][i],mid[idx][1][--mid_sz[idx][1]]); i--;}
  37. }
  38. mid[idx][1][mid_sz[idx][1]++]=make_pair(cnt,cost);
  39. }
  40. int main()
  41. {
  42. int m,n;
  43. char c,pre;
  44. while(scanf("%d",&m)!=EOF)
  45. {
  46. n=0;
  47. memset(p,0,26<<2);
  48. while((pre=getchar())&&!isupper(pre));
  49. while(1)
  50. {
  51. block[n]=make_pair(pre-'A',p[pre-'A']);
  52. dp[n][n]=1;
  53. while((c=getchar())&&c==pre) dp[n][n]++;
  54. if(dp[n][n]>=m) dp[n][n]=1;
  55. else dp[n][n]=m-dp[n][n];
  56. colors[pre-'A'][p[pre-'A']++]=n++;
  57. if(!isupper(c)) break;
  58. pre=c;
  59. }
  60. for(int i=1;i<n;i++)
  61. {
  62. for(int j=0;j<i;j++) dp[j][i]=dp[j][i-1]+dp[i][i];
  63. int ci=block[i].second;
  64. mid[ci][0][0]=make_pair(m-dp[i][i],0);
  65. mid_sz[ci][0]=1;
  66. mid_sz[ci][1]=0;
  67. for(int cj=ci-1,j;cj>=0;cj--)
  68. {
  69. j=colors[block[i].first][cj];
  70. mid_sz[cj][0]=mid_sz[cj][1]=0;
  71. for(int ck=ci,k;ck>cj;ck--)
  72. {
  73. k=colors[block[i].first][ck];
  74. for(int i_mid=0;i_mid<mid_sz[ck][0];i_mid++)
  75. {
  76. int cost=dp[j+1][k-1]+mid[ck][0][i_mid].second;
  77. if(cost>=dp[j][i]) continue;
  78. if(dp[j][j]>mid[ck][0][i_mid].first)
  79. {
  80. Add_mid0(cj,m-dp[j][j]+mid[ck][0][i_mid].first,cost);
  81. dp[j][i]=min(dp[j][i],cost+dp[j][j]-mid[ck][0][i_mid].first);
  82. }
  83. else
  84. {
  85. Add_mid1(cj,m-dp[j][j],cost);
  86. dp[j][i]=cost;
  87. }
  88. }
  89. for(int i_mid=0;i_mid<mid_sz[ck][1];i_mid++)
  90. {
  91. int cost=dp[j+1][k-1]+mid[ck][1][i_mid].second;
  92. if(cost>=dp[j][i]) continue;
  93. if(dp[j][j]>mid[ck][1][i_mid].first)
  94. {
  95. Add_mid1(cj,m-dp[j][j]+mid[ck][1][i_mid].first,cost);
  96. dp[j][i]=cost;
  97. }
  98. }
  99. }
  100. for(int k=j-1;k>=0;k--) dp[k][i]=min(dp[k][i],dp[k][j-1]+dp[j][i]);
  101. }
  102. }
  103. printf("%d\n",dp[0][n-1]);
  104. }
  105. }
Success #stdin #stdout 0s 3616KB
stdin
3
AAABAAA
3
ABBABBA
stdout
2
2