A. A Matrix

点击打开链接

构造,结论是从第一行開始往下产生一条曲线,使得这条区间最长且从上到下递减,

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <vector>
  7. #include <set>
  8. using namespace std;
  9. #define N 100005
  10. vector<int>G[N], P[N], tmp;
  11. set<int>s[N];
  12. set<int>::iterator it;
  13. int n,m;
  14. bool work(){
  15. for(int i = m; i>1; i--) {
  16. for(int j = G[i].size()-1; j>=0; j--) {
  17. it = s[i-1].lower_bound(-G[i][j]);
  18. if(it==s[i-1].end())return false;
  19. int pos = lower_bound(G[i-1].begin(), G[i-1].end(), -(*it))-G[i-1].begin();
  20. P[i-1][pos] = j;
  21. s[i-1].erase(it);
  22. }
  23. }
  24. return true;
  25. }
  26. void init(){
  27. for(int i = 0; i <= n; i++)G[i].clear(), s[i].clear(), P[i].clear();
  28. }
  29. int Stack[N];
  30. int main(){
  31. int T, Cas = 1,i,j,k;cin>>T;
  32. while(T--) {
  33. init();
  34. scanf("%d %d",&n,&m);
  35. bool success = true;
  36. for(i=1;i<=m;i++){
  37. scanf("%d",&k);
  38. for(int z = 0; z < k; z++)
  39. {
  40. scanf("%d",&j);
  41. G[i].push_back(j);
  42. s[i].insert(-j);
  43. if(z && G[i][z-1]>G[i][z])
  44. success=false;
  45. P[i].push_back(-1);
  46. }
  47. }
  48. printf("Case #%d: ",Cas++);
  49. if(success && work()) {
  50. int top = 0;
  51. for(i = 0; i < P[1].size(); i++)
  52. {
  53. int h = 1, l = i;
  54. tmp.clear();
  55. while(1)
  56. {
  57. tmp.push_back(G[h][l]);
  58. if(P[h][l]==-1)break;
  59. l = P[h][l];
  60. h++;
  61. }
  62. for(j=tmp.size()-1;j>=0;j--)
  63. Stack[top++] = tmp[j];
  64. }
  65. for(i=0;i<top;i++)
  66. printf("%d%c",Stack[i],i==top-1?'\n':' ');
  67. }
  68. else puts("No solution");
  69. }
  70. return 0;
  71. }

B. Beautiful Garden

B:

pid=34982">点击打开链接

暴力

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. typedef long long ll;
  5. const int N = 42;
  6. int n, a[N];
  7. int dis[N * N], dep;
  8. bool vis[N][N];
  9. int main() {
  10. int T;
  11. scanf("%d", &T);
  12. for (int cas = 1; cas <= T; ++cas) {
  13. scanf("%d", &n);
  14. for (int i = 0; i < n; ++i)
  15. scanf("%d", &a[i]);
  16. std::sort(a, a + n);
  17. dep = 0;
  18. for (int i = 0; i < n; ++i)
  19. for (int j = i + 1; j < n; ++j)
  20. dis[dep++] = a[j] - a[i];
  21. std::sort(dis, dis + dep);
  22. dep = std::unique(dis, dis + dep) - dis;
  23.  
  24. int ans = n - 1, cnt, idx, f;
  25. ll st;
  26.  
  27. for (int i = 0; i < dep; ++i) {
  28. memset(vis, 0, sizeof vis);
  29. for (int k = 0; k < n; ++k)
  30. for (int z = 0; z < n; ++z)
  31. if(!vis[k][z]) {
  32. st = a[k] - (ll)z * dis[i];
  33. cnt = idx = 0;
  34. f = 1;
  35. for (int l = 0; l < n; ++l) {
  36. while (idx < n && a[idx] < st)
  37. ++idx;
  38. if (idx < n && st == a[idx]) {
  39. if (vis[idx][l]) {
  40. f = 0;
  41. break;
  42. }
  43. vis[idx][l] = true;
  44. ++cnt, ++idx;
  45. }
  46. st += dis[i];
  47. }
  48. if (f && n - cnt < ans)
  49. ans = n - cnt;
  50. }
  51. }
  52. printf("Case #%d: %d\n", cas, ans);
  53. }
  54.  
  55. return 0;
  56. }

E. Elegant String

E:

pid=34985">点击打开链接

先得到一个dp方程

dp[i][j]表示字符串长度为i,结尾有j个数互不同样的方法数

然后得到转移方程再用矩阵高速幂加速

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <vector>
  7. #include <set>
  8. using namespace std;
  9. #define ll long long
  10. #define Matr 11
  11. #define mod 20140518
  12. struct mat{
  13. ll a[Matr][Matr],size;
  14. mat(){
  15. size = 0;
  16. memset(a, 0, sizeof a);
  17. }
  18. };
  19. mat multi(mat m1,mat m2){
  20. mat ans = mat(); ans.size = m1.size;
  21. for(int i = 1; i <= m1.size; i++)
  22. for(int j = 1; j<= m2.size; j++)
  23. if(m1.a[i][j])
  24. for(int k = 1; k <= m1.size; k++)
  25. ans.a[i][k] = (ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%mod;
  26. return ans;
  27. }
  28. mat quickmulti(mat m,ll n){
  29. mat ans = mat();
  30. ll i;
  31. for(i=1;i<=m.size;i++)ans.a[i][i] = 1;
  32. ans.size = m.size;
  33. while(n){
  34. if(n&1)ans = multi(m,ans);
  35. m=multi(m,m);
  36. n /= 2;
  37. }
  38. return ans;
  39. }
  40. ll n,k;
  41. int main(){
  42. ll T, Cas = 1;cin>>T;
  43. while(T--){
  44. cin>>n>>k;
  45. mat z = mat();
  46. for(ll i = 1; i <= k; i++)
  47. for(ll j = i; j <= k; j++)
  48. z.a[i][j] = 1;
  49. ll now = k;
  50. for(ll i = 2; i <= k; i++, now--)
  51. z.a[i][i-1]+=now;
  52. z.size = k;
  53. z = quickmulti(z, n-1);
  54. ll tmp = 0;
  55. for(ll i = 1; i <= k; i++)
  56. tmp += z.a[i][1];
  57. tmp *= (k+1);
  58. tmp %= mod;
  59. printf("Case #%lld: %lld\n",Cas++,tmp);
  60. }
  61. return 0;
  62. }

H. Happy Reversal

H:

pid=34988">点击打开链接

把全部数字取法后都一起排序,最大的减最小的就可以

可能最大最小都来源一个数,则答案就是 第二大减最小 或者最大减第二小

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = 20005;
  7. ll a[N], b[N];
  8. ll er[N];
  9. int main() {
  10. int T;
  11. char s[66];
  12. er[0] = 1;
  13. for(int i = 1;i<63;i++)er[i] = er[i-1]*2;
  14. while(~scanf("%d", &T)) {
  15. for(int cas = 1; cas <= T; cas ++) {
  16. int n, m;
  17. scanf("%d%d", &n, &m);
  18. for(int i = 0; i < n; i ++) {
  19. scanf("%s", s);
  20. ll suma = 0;
  21. ll sumb = 0;
  22. for(int j = 0; j < m; j ++) {
  23. suma = suma * 2 + (s[j] == '1');
  24. sumb = sumb * 2 + (s[j] == '0');
  25. }
  26. a[i*2] = max(suma, sumb);
  27. a[i*2+1] = min(suma, sumb);
  28. }
  29. sort(a, a + n + n);
  30. ll ans;
  31. if( a[2*n-1] + a[0] + 1 == er[m] ) ans = max(a[2*n-2] - a[0], a[2*n-1] - a[1]);
  32. else ans = a[2*n-1] - a[0];
  33. printf("Case #%d: %lld\n", cas, ans);
  34. }
  35. }
  36. return 0;
  37. }

J. Justice String

J:点击打开链接

hash二分第一个不同的字符距离0的位置,再二分第二个不同的字符距离第一个字符的位置

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int MAX_N = 3000007;
  6. int sa[MAX_N], ws[MAX_N], rank[MAX_N], height[MAX_N];
  7. #define F(x) ((x)/3+((x)%3==1?
  8.  
  9. 0:tb))
  10. #define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
  11. int wa[MAX_N],wb[MAX_N],wv[MAX_N],wss[MAX_N];
  12. struct suffix {
  13. int c0(int *r, int a, int b) {
  14. return r[a] == r[b] && r[a+1] == r[b+1] && r[a+2] == r[b+2];
  15. }
  16. int c12(int k,int *r,int a,int b) {
  17. if(k == 2)
  18. return r[a] < r[b] || ( r[a] == r[b] && c12(1,r,a+1,b+1) );
  19. else return r[a] < r[b] || ( r[a] == r[b] && wv[a+1] < wv[b+1] );
  20. }
  21. void sort(int *r,int *a,int *b,int n,int m) {
  22. int i;
  23. for(i = 0;i < n;i++)wv[i] = r[a[i]];
  24. for(i = 0;i < m;i++)wss[i] = 0;
  25. for(i = 0;i < n;i++)wss[wv[i]]++;
  26. for(i = 1;i < m;i++)wss[i] += wss[i-1];
  27. for(i = n-1;i >= 0;i--)
  28. b[--wss[wv[i]]] = a[i];
  29. }
  30. void dc3(int *r,int *sa,int n,int m) {
  31. int i, j, *rn = r + n;
  32. int *san = sa + n, ta = 0, tb = (n+1)/3, tbc = 0, p;
  33. r[n] = r[n+1] = 0;
  34. for(i = 0;i < n;i++)if(i %3 != 0)wa[tbc++] = i;
  35. sort(r + 2, wa, wb, tbc, m);
  36. sort(r + 1, wb, wa, tbc, m);
  37. sort(r, wa, wb, tbc, m);
  38. for(p = 1, rn[F(wb[0])] = 0, i = 1;i < tbc;i++)
  39. rn[F(wb[i])] = c0(r, wb[i-1], wb[i]) ? p - 1 : p++;
  40. if(p < tbc)dc3(rn,san,tbc,p);
  41. else for(i = 0;i < tbc;i++)san[rn[i]] = i;
  42. for(i = 0;i < tbc;i++) if(san[i] < tb)wb[ta++] = san[i] * 3;
  43. if(n % 3 == 1)wb[ta++] = n - 1;
  44. sort(r, wb, wa, ta, m);
  45. for(i = 0;i < tbc;i++)wv[wb[i] = G(san[i])] = i;
  46. for(i = 0, j = 0, p = 0;i < ta && j < tbc;p++)
  47. sa[p] = c12(wb[j] % 3, r, wa[i], wb[j]) ? wa[i++] : wb[j++];
  48. for(;i < ta;p++)sa[p] = wa[i++];
  49. for(;j < tbc;p++)sa[p] = wb[j++];
  50. }
  51. void DA(int str[],int sa[],int n,int m) {
  52. for(int i = n;i < n*3;i++)
  53. str[i] = 0;
  54. dc3(str, sa, n+1, m);
  55. int i,j,k = 0;
  56. for(i = 0;i <= n;i++)rank[sa[i]] = i;
  57. for(i = 0;i < n; i++)
  58. {
  59. if(k) k--;
  60. j = sa[rank[i]-1];
  61. while(str[i+k] == str[j+k]) k++;
  62. height[rank[i]] = k;
  63. }
  64. }
  65. };
  66. int RMQ[MAX_N], mm[MAX_N], best[20][MAX_N];
  67. void initRMQ(int n) {
  68. mm[0] = -1;
  69. for(int i = 1; i <= n; ++i) {
  70. mm[i]=((i & (i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];
  71. }
  72. for (int i = 1; i <= n; ++i) {
  73. best[0][i] = i;
  74. }
  75. for (int i = 1; i <= mm[n]; ++i) {
  76. for (int j = 1; j + (1 << i) - 1 <= n; ++j) {
  77. int a = best[i - 1][j];
  78. int b = best[i - 1][j + (1 << (i - 1))];
  79. if (RMQ[a] < RMQ[b]) best[i][j] = a;
  80. else best[i][j] = b;
  81. }
  82. }
  83. }
  84. int query(int a, int b) {
  85. int t = mm[b - a + 1];
  86. b -= (1 << t) - 1;
  87. a = best[t][a], b = best[t][b];
  88. return RMQ[a] < RMQ[b] ?
  89.  
  90. a : b;
  91. }
  92. int lcp(int a, int b) {
  93. a = rank[a], b = rank[b];
  94. if (a > b) swap(a, b);
  95. return height[query(a + 1, b)];
  96. }
  97. char A[MAX_N],B[MAX_N];
  98. int r[MAX_N], da[MAX_N];
  99. int main() {
  100. int T;
  101. int cas = 0;
  102. scanf("%d",&T);
  103. while(T-- > 0) {
  104. suffix ar;
  105. scanf("%s%s",A, B);
  106. int len1 = strlen(A);
  107. int len2 = strlen(B);
  108. if(len1 < len2) {
  109. printf("Case #%d: -1\n", ++cas);
  110. continue;
  111. }
  112. int n = len1 + len2 + 1;
  113. for(int i = 0; i < len1; ++i) r[i] = A[i];
  114. for(int i = 0; i < len2; ++i) r[len1 + 1 + i] = B[i];
  115. r[len1] = 1;
  116. r[n] = 0;
  117. ar.DA(r, sa, n, 128);
  118.  
  119. for(int i = 1; i <= n; ++i)
  120. RMQ[i] = height[i];
  121. initRMQ(n);
  122. int ans = -1;
  123. for(int i = 0; i <= len1 - len2; ++i) {
  124. int st = i;
  125. int ed = len1 + 1;
  126. int tmp = lcp(st, ed);
  127. // printf("here1 %d %d %d\n", st, ed, tmp);
  128. st += tmp;
  129. ed += tmp;
  130. if(ed >= n) {
  131. ans = i;
  132. break;
  133. }
  134. st++;
  135. ed++;
  136. if(ed >= n) {
  137. ans = i;
  138. break;
  139. }
  140. tmp = lcp(st, ed);
  141. // printf("here2 %d %d %d\n", st, ed, tmp);
  142. st += tmp;
  143. ed += tmp;
  144. if(ed >= n) {
  145. ans = i;
  146. break;
  147. }
  148. st++;
  149. ed++;
  150. if(ed >= n) {
  151. ans = i;
  152. break;
  153. }
  154. tmp = lcp(st, ed);
  155. // printf("here3 %d %d %d\n", st, ed, tmp);
  156. st += tmp;
  157. ed += tmp;
  158. if(ed >= n) {
  159. ans = i;
  160. break;
  161. }
  162. }
  163. printf("Case #%d: %d\n", ++cas, ans);
  164. }
  165. return 0;
  166. }

2014 北京邀请赛ABDHJ题解的更多相关文章

  1. 2014 ACM/ICPC 北京邀请赛 部分 题解

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem.php?search=2014+ACM-ICPC+Beijing+Invitational+Programming+C ...

  2. hihocoder 1084 扩展KMP && 2014 北京邀请赛 Justice String

    hihocoder 1084 : http://hihocoder.com/problemset/problem/1084 北京邀请赛 Just  String http://www.bnuoj.co ...

  3. BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的 ...

  4. 2014 北京 DevFest 大会能够报名啦,小伙伴们还在等什么

    一年一度的大型开发人员活动,2014 北京 DevFest 大会站点正式上线: http://devfest.gdgbeijing.org/. 还等什么,開始报名了! 今年 DevFest 大会将再次 ...

  5. bnu A Matrix 北京邀请赛A题

    A Matrix Time Limit: 2000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class n ...

  6. HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)

    Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ...

  7. HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)

    Battle ships Problem DescriptionDear contestant, now you are an excellent navy commander, who is res ...

  8. HDU5099——Comparison of Android versions(简单题)(2014上海邀请赛重现)

    Comparison of Android versionsProblem DescriptionAs an Android developer, itˇs really not easy to fi ...

  9. HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)

    Game with Pearls Problem DescriptionTom and Jerry are playing a game with tubes and pearls. The rule ...

随机推荐

  1. 从零开始写驱动——vfd专用驱动芯片HT16514并行驱动程序编写

    前言 一直看别人搞的 vfd 很漂亮,前段时间淘了个 vfd 模块来,但没有模块资料,还好芯片没有打磨的,良心商家啊.周末抽空来研究一下这个东西. 从零开始 打开外壳 测试线路 查看芯片是 HT165 ...

  2. 【Cocos2D-x 3.5实战】坦克大战(1)环境配置

    前言: 最近课比较少,空闲时间比较多,一有时间就东想西想,想着想着就突然想到做手机游戏(android)了,学习下CoCos2d.看了一些CoCos2D的相关文档和教程,觉得是时候实战了,但是苦于没有 ...

  3. this function has none of deterministic, no sql,or reads sql data in its declaration and binary logging is enabled

      原址:http://blog.chinaunix.net/uid-20639775-id-3031821.html   This function has none of DETERMINISTI ...

  4. JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)

    // 获取RFC返回的字段值 11 JCoParameterList exportParam = function.getExportParameterList(); 12 String exPara ...

  5. (Problem 53)Combinatoric selections

    There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 2 ...

  6. AngularJS的启动引导过程

    原文:http://www.angularjs.cn/A137?utm_source=ourjs.com 目录: 引导之前 自动引导启动框架 手工引导启动框架 引导第1步:创建注入器 引导第2步:创建 ...

  7. utf8_general_ci 、utf8_general_cs和utf8_bin的区别

    用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别..ci是 case insensitive, 即 "大小写不敏感", a 和 A ...

  8. Noip2009提高组总结

    Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数.仔细想想,我们化学老师说的话没错,或许题目你都会做, ...

  9. 高可用mysql集群搭建

    对web系统来说,瓶颈大多在数据库和磁盘IO上面,而不是服务器的计算能力.对于系统伸缩性我们一般有2种解决方案,scale-up(纵向扩展)和scale-out(横向扩展).前者如扩内存,增加单机性能 ...

  10. [置顶] SQL日期类型

    在做机房收费系统的时候,上下机,我觉得是我在整个系统中遇到最棘手的问题了,现在就给大家,分享一下,我是怎样解决的. SQL中有3中数据类型是关于日期的,每一种的用法是不同的,当你用错了,就会出现下面这 ...