后缀数组求不重复回文子串数目。注意dp数组。

  1. /* 3948 */
  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 INF = 0x3f3f3f3f;
  44. const int maxl = 2e5+;
  45. const int maxn = 4e5+;
  46. char s[maxl], ss[maxl];
  47. int a[maxn];
  48. int height[maxn], rrank[maxn], sa[maxn];
  49. int wa[maxn], wb[maxn], wc[maxn], wv[maxn];
  50. bool visit[maxn];
  51. int dp[][maxn];
  52.  
  53. bool cmp(int *r, int a, int b, int l) {
  54. return r[a]==r[b] && r[a+l]==r[b+l];
  55. }
  56.  
  57. void da(int *r, int *sa, int n, int m) {
  58. int i, j, *x=wa, *y=wb, *t, p;
  59.  
  60. for (i=; i<m; ++i) wc[i] = ;
  61. for (i=; i<n; ++i) wc[x[i]=r[i]]++;
  62. for (i=; i<m; ++i) wc[i] += wc[i-];
  63. for (i=n-; i>=; --i) sa[--wc[x[i]]]=i;
  64. for (j=,p=; p<n; j*=, m=p) {
  65. for (p=,i=n-j; i<n; ++i) y[p++] = i;
  66. for (i=; i<n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
  67. for (i=; i<n; ++i) wv[i] = x[y[i]];
  68. for (i=; i<m; ++i) wc[i] = ;
  69. for (i=; i<n; ++i) wc[wv[i]]++;
  70. for (i=; i<m; ++i) wc[i] += wc[i-];
  71. for (i=n-; i>=; --i) sa[--wc[wv[i]]] = y[i];
  72. for (t=x,x=y,y=t, x[sa[]]=, p=,i=; i<n; ++i)
  73. x[sa[i]] = cmp(y, sa[i-], sa[i], j) ? p-:p++;
  74. }
  75. }
  76.  
  77. void calheight(int *r, int *sa, int n) {
  78. int i, j, k = ;
  79.  
  80. for (i=; i<=n; ++i) rrank[sa[i]] = i;
  81. for (i=; i<n; height[rrank[i++]]=k)
  82. for (k?k--:, j=sa[rrank[i]-]; r[i+k]==r[j+k]; ++k) ;
  83. }
  84.  
  85. void printSa(int n) {
  86. for (int i=; i<=n; ++i)
  87. printf("%d ", sa[i]);
  88. putchar('\n');
  89. }
  90.  
  91. void printHeight(int n) {
  92. for (int i=; i<=n; ++i)
  93. printf("%d ", height[i]);
  94. putchar('\n');
  95. }
  96.  
  97. void printRank(int n) {
  98. for (int i=; i<=n; ++i)
  99. printf("%d ", rrank[i]);
  100. putchar('\n');
  101. }
  102.  
  103. void init_RMQ(int n) {
  104. int i, j;
  105.  
  106. for (i=; i<=n; ++i)
  107. dp[][i] = height[i];
  108. dp[][] = INF;
  109. for (j=; (<<j)<=n; ++j)
  110. for (i=; i+(<<j)-<=n; ++i)
  111. dp[j][i] = min(dp[j-][i], dp[j-][i+(<<(j-))]);
  112. }
  113.  
  114. int RMQ(int l, int r) {
  115. if (l > r)
  116. swap(l, r);
  117.  
  118. ++l;
  119. int k = ;
  120.  
  121. while (<<(k+) <= r-l+)
  122. ++k;
  123.  
  124. return min(dp[k][l], dp[k][r-(<<k)+]);
  125. }
  126.  
  127. void solve() {
  128. int len = strlen(s);
  129. int nn = len * + , n, nn2 = nn * ;
  130. int l = ;
  131.  
  132. rep(i, , len) {
  133. a[l] = a[nn2-l] = ;
  134. ++l;
  135. a[l] = a[nn2-l] = s[i]-'a'+;
  136. ++l;
  137. }
  138. a[l] = a[nn2-l] = ;
  139. a[nn] = ;
  140. a[nn2+] = ;
  141.  
  142. n = nn2 + ;
  143. da(a, sa, n+, );
  144. calheight(a, sa, n);
  145.  
  146. #ifndef ONLINE_JUDGE
  147. // printSa(n);
  148. // printHeight(n);
  149. #endif
  150.  
  151. init_RMQ(n);
  152.  
  153. int ans = , mn = , tmp;
  154.  
  155. memset(visit, false, sizeof(visit));
  156. rep(i, , n+) {
  157. mn = min(mn, height[i]);
  158. if (visit[nn2-sa[i]]) {
  159. tmp = RMQ(rrank[sa[i]], rrank[nn2-sa[i]]);
  160. if (tmp > mn) {
  161. ans += (tmp - mn) >> ;
  162. mn = tmp;
  163. }
  164. } else {
  165. visit[sa[i]] = true;
  166. }
  167. }
  168.  
  169. printf("%d\n", ans);
  170. }
  171.  
  172. int main() {
  173. ios::sync_with_stdio(false);
  174. #ifndef ONLINE_JUDGE
  175. freopen("data.in", "r", stdin);
  176. freopen("data.out", "w", stdout);
  177. #endif
  178.  
  179. int t;
  180.  
  181. scanf("%d", &t);
  182. rep(tt, , t+) {
  183. scanf("%s", s);
  184. printf("Case #%d: ", tt);
  185. solve();
  186. }
  187.  
  188. #ifndef ONLINE_JUDGE
  189. printf("time = %d.\n", (int)clock());
  190. #endif
  191.  
  192. return ;
  193. }

数据生成器。

  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 =
  8. bound = **
  9. lc = list(string.lowercase)
  10. fout.write("%d\n" % (t))
  11. for tt in xrange(t):
  12. length = randint(, )
  13. line = ""
  14. for i in xrange(length):
  15. idx = randint(, )
  16. line += lc[idx]
  17. fout.write("%s\n" % (line))
  18.  
  19. def MovDataIn():
  20. desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
  21. shutil.copyfile("data.in", desFileName)
  22.  
  23. if __name__ == "__main__":
  24. GenDataIn()
  25. MovDataIn()

【HDOJ】3948 The Number of Palindromes的更多相关文章

  1. 【CF245H】Queries for Number of Palindromes(回文树)

    [CF245H]Queries for Number of Palindromes(回文树) 题面 洛谷 题解 回文树,很类似原来一道后缀自动机的题目 后缀自动机那道题 看到\(n\)的范围很小,但是 ...

  2. 【HDOJ】4162 Shape Number

    循环串的最小表示法. /* */ #include <iostream> #include <string> #include <map> #include < ...

  3. 【HDOJ】1018 Big Number

    数学题,还是使用log避免大数,但是不要忘记需要+1,因为0也是1位,log(100)= 2,但却是3位. #include <stdio.h> #include <math.h&g ...

  4. 【HDOJ】3006 The Number of set

    数据量这么小,果断状态压缩+dp. /* 3006 */ #include <iostream> #include <string> #include <map> ...

  5. 【HDOJ】5179 beautiful number

    DFS. /* 5179 */ #include <iostream> #include <algorithm> #include <map> #include & ...

  6. 【转】oracle数据库NUMBER数据类型

    原文:http://www.jb51.net/article/37633.htm NUMBER ( precision, scale)a)  precision表示数字中的有效位;如果没有指定prec ...

  7. 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树

    [BZOJ4026]dC Loves Number Theory Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.    给 ...

  8. 【LeetCode】375. Guess Number Higher or Lower II 解题报告(Python)

    [LeetCode]375. Guess Number Higher or Lower II 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...

  9. 【LeetCode】137. Single Number II 解题报告(Python)

    [LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...

随机推荐

  1. NSS_03 过滤器

    asp.net mvc3有四类过滤器:授权, 操作,结果, 异常.操行的顺序为:授权,操作,结果,异常. 首先看一下TempData: 数据只能经过至多一次的Controller传递, 并且每个元素至 ...

  2. GDI+绘制文本

    这是在论坛中有人提出的一个问题,原贴见:Graphics DrawString参数无效.这里给出方法,读者可以自行修改以适应自己的项目需求. 先上代码: if (!Page.IsPostBack) { ...

  3. 教你配置linux服务器登陆欢迎信息

    登录一台测试机时发现显示PS1前还显了一行’Welcome to Cloudex’的欢迎信息,真丫牛B.在linux中,设置/etc/issue和/etc/motd文件即可实现这样的登录欢迎信息. 登 ...

  4. 研读代码必须掌握的Eclipse快捷键

    1. Ctrl+左键 和F3 这个是大多数人经常用到的,用来查看变量.方法.类的定义跳到光标所在标识符的定义代码.当按执行流程阅读时,F3实现了大部分导航动作. 2 Ctrl+Shift+G在工作空间 ...

  5. 【BZOJ 1821】 [JSOI2010]Group 部落划分 Group

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

  6. 微软职位内部推荐-Data Scientist

    微软近期Open的职位: Job Description:Extracting accurate, insightful and actionable information from data is ...

  7. sql中的inner join, left join, right join的区别

    下面介绍一下 inner join, left join, right join这者之间的区别 现在我假设有A表和B表 left join select * from A a left join B ...

  8. JVM -XX: 参数介绍(转)

    垃圾回收器相关常用参数: 功能开关: 参数 默认值或限制 说明 参数 默认值 功能 -XX:-AllowUserSignalHandlers 限于Linux和Solaris,默认不启用 允许为java ...

  9. willMoveToParentViewController 与 didMoveToParentViewController

    在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖 ...

  10. UILabel设置行间距和字间距并计算高度-b

    #define UILABEL_LINE_SPACE 6 #define HEIGHT [ [ UIScreen mainScreen ] bounds ].size.height //给UILabe ...