思路是枚举矩阵列数,然后将字符矩阵转换成字符串,通过字符数组求不同子串数目。最后,减去不成立的情况。使用特殊字符分割可能的组合。

  1. /* 4029 */
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <queue>
  7. #include <set>
  8. #include <stack>
  9. #include <vector>
  10. #include <deque>
  11. #include <algorithm>
  12. #include <cstdio>
  13. #include <cmath>
  14. #include <ctime>
  15. #include <cstring>
  16. #include <climits>
  17. #include <cctype>
  18. #include <cassert>
  19. #include <functional>
  20. #include <iterator>
  21. #include <iomanip>
  22. using namespace std;
  23. //#pragma comment(linker,"/STACK:102400000,1024000")
  24.  
  25. #define sti set<int>
  26. #define stpii set<pair<int, int> >
  27. #define mpii map<int,int>
  28. #define vi vector<int>
  29. #define pii pair<int,int>
  30. #define vpii vector<pair<int,int> >
  31. #define rep(i, a, n) for (int i=a;i<n;++i)
  32. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  33. #define clr clear
  34. #define pb push_back
  35. #define mp make_pair
  36. #define fir first
  37. #define sec second
  38. #define all(x) (x).begin(),(x).end()
  39. #define SZ(x) ((int)(x).size())
  40. #define lson l, mid, rt<<1
  41. #define rson mid+1, r, rt<<1|1
  42.  
  43. const int maxr = ;
  44. const int maxn = 2e5+;
  45. const int base = ;
  46. map<int,int> tb;
  47. int a[maxn*];
  48. int height[maxn], rrank[maxn], sa[maxn*];
  49. int wa[maxn], wb[maxn], wc[maxn], wv[maxn];
  50. char s[maxr][maxr];
  51. int H[maxr][maxr];
  52. int r, c;
  53.  
  54. bool c0(int *r, int a, int b) {
  55. return r[a]==r[b] && r[a+]==r[b+] && r[a+]==r[b+];
  56. }
  57.  
  58. bool c12(int k, int *r, int a, int b) {
  59. if (k == )
  60. return r[a]<r[b] || (r[a]==r[b] && c12(, r, a+, b+));
  61. else
  62. return r[a]<r[b] || (r[a]==r[b] && wv[a+]<wv[b+]);
  63. }
  64.  
  65. void sort(int *r, int *a, int *b, int n, int m) {
  66. int i;
  67.  
  68. for (i=; i<n; ++i) wv[i] = r[a[i]];
  69. for (i=; i<m; ++i) wc[i] = ;
  70. for (i=; i<n; ++i) wc[wv[i]]++;
  71. for (i=; i<m; ++i) wc[i] += wc[i-];
  72. for (i=n-; i>=; --i) b[--wc[wv[i]]] = a[i];
  73. }
  74.  
  75. #define F(x) ((x)/3 + ((x)%3==1 ? 0:tb))
  76. #define G(x) ((x)<tb ? (x)*3+1 : ((x)-tb)*3+2)
  77. void dc3(int *r, int *sa, int n, int m) {
  78. int i, j, *rn=r+n, *san=sa+n, ta=, tb=(n+)/, tbc=, p;
  79.  
  80. r[n] = r[n+] = ;
  81. for (i=; i<n; ++i) if (i%!=) wa[tbc++] = i;
  82. sort(r+, wa, wb, tbc, m);
  83. sort(r+, wb, wa, tbc, m);
  84. sort(r, wa, wb, tbc, m);
  85. for (p=, rn[F(wb[])]=, i=; i<tbc; ++i)
  86. rn[F(wb[i])] = c0(r, wb[i-], wb[i]) ? p- : p++;
  87. if (p < tbc)
  88. dc3(rn, san, tbc, p);
  89. else
  90. for (i=; i<tbc; ++i) san[rn[i]] = i;
  91. for (i=; i<tbc; ++i)
  92. if (san[i] < tb)
  93. wb[ta++] = san[i] * ;
  94. if (n% == )
  95. wb[ta++] = n - ;
  96. sort(r, wb, wa, ta, m);
  97. for (i=; i<tbc; ++i) wv[wb[i]=G(san[i])] = i;
  98. for (i=,j=,p=; i<ta && j<tbc; ++p)
  99. sa[p] = c12(wb[j]%, r, wa[i], wb[j]) ? wa[i++] : wb[j++];
  100. while (i < ta) sa[p++] = wa[i++];
  101. while (j < tbc) sa[p++] = wb[j++];
  102. }
  103.  
  104. void calheight(int *r, int *sa, int n) {
  105. int i, j, k = ;
  106.  
  107. for (i=; i<=n; ++i) rrank[sa[i]] = i;
  108. for (i=; i<n; height[rrank[i++]]=k)
  109. for (k?k--:, j=sa[rrank[i]-]; r[j+k]==r[i+k]; ++k) ;
  110. }
  111.  
  112. void printSa(int n) {
  113. for (int i=; i<=n; ++i)
  114. printf("%d ", sa[i]);
  115. putchar('\n');
  116. }
  117.  
  118. void printHeight(int n) {
  119. for (int i=; i<=n; ++i)
  120. printf("%d ", height[i]);
  121. putchar('\n');
  122. }
  123.  
  124. void solve() {
  125. __int64 ans = , tot, tmp;
  126. int n = ;
  127.  
  128. memset(H, , sizeof(H));
  129. rep(w, , c+) {
  130. tb.clr();
  131. int cn = c - w + ;
  132. int cnt = cn + ;
  133. int sidx = ;
  134.  
  135. rep(i, , r) {
  136. rep(j, , cn) {
  137. H[i][j] = H[i][j] * base + s[i][j+w-]-'A';
  138. if (tb.find(H[i][j]) == tb.end())
  139. tb[H[i][j]] = cnt++;
  140. }
  141. }
  142.  
  143. n = ;
  144. rep(j, , cn) {
  145. rep(i, , r)
  146. a[n++] = tb[H[i][j]];
  147. a[n++] = sidx++;
  148. }
  149. a[n] = ;
  150.  
  151. dc3(a, sa, n+, cnt+);
  152. calheight(a, sa, n);
  153.  
  154. tot = ;
  155. rep(i, , n+)
  156. tot += (n - sa[i] - height[i]);
  157.  
  158. tmp = n;
  159. rep(i, , cn) {
  160. tmp -= r;
  161. tot -= (r+) * tmp;
  162. --tmp;
  163. }
  164.  
  165. ans += tot;
  166. }
  167.  
  168. printf("%I64d\n", ans);
  169. }
  170.  
  171. int main() {
  172. ios::sync_with_stdio(false);
  173. #ifndef ONLINE_JUDGE
  174. freopen("data.in", "r", stdin);
  175. freopen("data.out", "w", stdout);
  176. #endif
  177.  
  178. int t;
  179.  
  180. scanf("%d", &t);
  181. rep(tt, , t+) {
  182. scanf("%d %d", &r, &c);
  183. rep(i, , r)
  184. scanf("%s", s[i]);
  185. printf("Case #%d: ", tt);
  186. solve();
  187. }
  188.  
  189. #ifndef ONLINE_JUDGE
  190. printf("time = %d.\n", (int)clock());
  191. #endif
  192.  
  193. return ;
  194. }

数据生成器。

  1. from random import randint, shuffle
  2. import shutil
  3. import string
  4.  
  5. def GenDataIn():
  6. with open("data.in", "w") as fout:
  7. t = 20
  8. uc = list(string.uppercase)
  9. fout.write("%d\n" % (t))
  10. for tt in xrange(t):
  11. n = randint(20, 50)
  12. m = randint(20, 50)
  13. fout.write("%d %d\n" % (n, m))
  14. for i in xrange(n):
  15. line = ""
  16. for j in xrange(m):
  17. idx = randint(0, 25)
  18. line += uc[idx]
  19. fout.write("%s\n" % (line))
  20.  
  21. def MovDataIn():
  22. desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
  23. shutil.copyfile("data.in", desFileName)
  24.  
  25. if __name__ == "__main__":
  26. GenDataIn()
  27. MovDataIn()

【HDOJ】4029 Distinct Sub-matrix的更多相关文章

  1. 【线性代数】2-4:矩阵操作(Matrix Operations)

    title: [线性代数]2-4:矩阵操作(Matrix Operations) toc: true categories: Mathematic Linear Algebra date: 2017- ...

  2. 【HDOJ】2830 Matrix Swapping II

    简单DP. /* 2830 */ #include <iostream> #include <string> #include <map> #include < ...

  3. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  4. 【Lintcode】118.Distinct Subsequences

    题目: Given a string S and a string T, count the number of distinct subsequences of T in S. A subseque ...

  5. 【leetcode】Search a 2D Matrix

    Search a 2D Matrix Write an efficient algorithm that searches for a value in an m x n matrix. This m ...

  6. 【leetcode】 Search a 2D Matrix (easy)

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  7. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  8. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  9. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

随机推荐

  1. C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  2. Keep two divs sync scroll and example

    srcDiv has visible horizontal scrollbar.(style="overflow:auto;") targetDiv has no scrollba ...

  3. js判断IE6(推荐方法一)

    不得不使用判断的方法 //方法1:推荐 if ( /MSIE 6/.test(navigator.userAgent)){ } //方法2: if ( navigator.appVersion.ind ...

  4. iphone开发第二个程序

    此程序包括UIProgressView,UIButton, UIDatePicker,UIAlert,UILabel,NSTimer // //  HViewController.h //  Btn_ ...

  5. Cocos-x 3.2:从C++过渡到Lua(转载)

    原文总结的非常好,都是我们学cocos2d-x以来摸索过的东西,如果早有这篇文章就能少走不少弯路了,特此截屏保存.原文链接:http://shahdza.blog.51cto.com/2410787/ ...

  6. 在cmd命令行下登录本地oracle数据库与服务器上的oracle

    一.本地登录 cmd->sqlplus 用户名/密码@数据库名 (as sysdba)->enter注:如果此用户名不是系统用户sys,scott,system就不需要加as sysdba ...

  7. 获取局域网ip

    显然不可使用基于request请求的request.getRemoteAddr()这个是获取广域网内的服务器地址,比如我请求百度使用这个方法就可以获取到百度的服务器地址 那么InetAddress的I ...

  8. WDC2106 iOS10新特性及开发者要注意什么

    昨晚苹果在旧金山召开了WWDC,看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强 ...

  9. linux驱动系列之调试环境搭建一

    2014年刚开始学习linux时,搭建环境花了很多时间.当时最熟悉的是单片机如Mag16和stm32,依据以往学习单片机的经验肯定要用下载器下载程序,但是我找了很久没有比较好的IDE,不像Mag16有 ...

  10. SDIBT 3237 Boring Counting( 划分树+二分枚举 )

    http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec  ...