HDU 3948 不同回文子串个数

集训队论文中有求不同子串个数的做法,就是扫一遍height数组,过程中根据height数组进行去重。对于本题也是雷同的,只是每一次不是根据与排名在上一位的LCP去重,而是与上一次统计对答案有贡献的后缀进行比较去重。

几组数据

abacaba 7

abbacaa 7

baabcaa 5

  1 #include <iostream>
  2 #include <vector>
  3 #include <algorithm>
  4 #include <string>
  5 #include <string.h>
  6 #include <stdio.h>
  7 #include <queue>
  8 #include <stack>
  9 #include <map>
 10 #include <set>
 11 #include <cmath>
 12 #include <ctime>
 13 #include <cassert>
 14 #include <sstream>
 15 using namespace std;
 16 
 17 const int N=123456*2;
 18 
 19 char s[N];
 20 struct SuffixArray {
 21      int wa[N], wb[N], cnt[N], wv[N];
 22     int rk[N], height[N];
 23     int sa[N];
 24     bool cmp(int r[], int a, int b, int l) {
 25         return r[a] == r[b] && r[a+l] == r[b+l];
 26     }
 27     void calcSA(char r[], int n, int m) {
 28         int i, j, p, *x = wa, *y = wb;
 29         for (i = 0; i < m; ++i) cnt[i] = 0;
 30         for (i = 0; i < n; ++i) cnt[x[i]=r[i]]++;
 31         for (i = 1; i < m; ++i) cnt[i] += cnt[i-1];
 32         for (i = n-1; i >= 0; --i) sa[--cnt[x[i]]] = i;
 33         for (j = 1, p = 1; p < n; j *= 2, m = p) {
 34             for (p = 0, i = n - j; i < n; ++i) y[p++] = i;
 35             for (i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
 36             for (i = 0; i < n; ++i) wv[i] = x[y[i]];
 37             for (i = 0; i < m; ++i) cnt[i] = 0;
 38             for (i = 0; i < n; ++i) cnt[wv[i]]++;
 39             for (i = 1; i < m; ++i) cnt[i] += cnt[i-1];
 40             for (i = n-1; i >= 0; --i) sa[--cnt[wv[i]]] = y[i];
 41             for (swap(x, y), p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)
 42                 x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p-1 : p++;
 43         }
 44     }
 45     void calcHeight(char r[], int n) {
 46         int i, j, k = 0;
 47         for (i = 0; i <= n; ++i) rk[sa[i]] = i;
 48         for (i = 0; i < n; height[rk[i++]] = k)
 49             for (k?k--:0, j = sa[rk[i]-1]; r[i+k] == r[j+k]; k++);
 50     }
 51     int lcp(int a,int b,int len) {
 52         if (a==b) return len-a;
 53         int ra=rk[a],rb=rk[b];
 54         if (ra>rb) swap(ra,rb);
 55         return queryST(ra+1,rb);
 56     }
 57     int st[N][22];
 58     void initST(int n) {
 59         for (int i=1; i<=n; i++)
 60             st[i][0]=height[i];
 61         for (int j=1; (1<<j)<=n; j++) {
 62             int k=1<<(j-1);
 63             for (int i=1; i+k<=n; i++)
 64                 st[i][j]=min(st[i][j-1],st[i+k][j-1]);
 65         }
 66     }
 67     int queryST(int a,int b) {
 68         if (a>b) swap(a,b);
 69         int dis=b-a+1;
 70         int k=log((double)dis)/log(2.0);
 71         return min(st[a][k],st[b-(1<<k)+1][k]);
 72     }
 73     void solve(int cas) {
 74         int n=strlen(s);
 75         s[n]='#';
 76         for (int i=0;i<n;i++) {
 77             s[n+1+i]=s[n-1-i];
 78         }
 79         int o=n;
 80         n=2*n+1;
 81         s[n]='\0';
 82         calcSA(s,n+1,128);
 83         calcHeight(s,n);
 84         initST(n);
 85         long long ret=0;
 86         int curLcp=0;
 87         for (int i=1;i<=n;i++) { //odd
 88             int pos=sa[i];
 89             curLcp=min(curLcp,height[i]);
 90             if (pos<o) {
 91                 int ops=n-1-pos;
 92                 int now=lcp(pos,ops,n);
 93                 ret+=max(0,now-curLcp);
 94                 if (now>=curLcp)
 95                     curLcp=now;
 96             }
 97         }
 98         curLcp=0;
 99         for (int i=1;i<=n;i++) { //even
100             int pos=sa[i];
101             curLcp=min(curLcp,height[i]);
102             if (pos<o) {
103                 int ops=n-pos;
104                 int now=lcp(pos,ops,n);
105                 ret+=max(0,now-curLcp);
106                 if (now>=curLcp)
107                     curLcp=now;
108             }
109         }
110         printf("Case #%d: %I64d\n",cas,ret);
111     }
112 }suf;
113 
114 int main () {
115     //freopen("out.txt","r",stdin);
116     int T;
117     scanf("%d",&T);
118     int cas=1;
119     while (T--) {
120        scanf("%s",s);
121        suf.solve(cas);
122        cas++;
123     }
124     return 0;
125 }
View Code

 

转载于:https://www.cnblogs.com/micrari/p/4993359.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何成为一名优秀的程序员?

1、理解技术债务技术债务就像信用卡一样&#xff0c;会有很高的利息率&#xff0c;时间越长&#xff0c;修复所花的代价就越大&#xff0c;程序员对这个要有深刻的认识。同时团队应该培养一种保证设计质量的文化&#xff0c;应当鼓励重构、同时也应当鼓励其它有关代码质量的实践…

php 发邮件附件pdf,php – 使用TCPDF发送电子邮件附件 | 码农网

我有一个简单的课程申请表,填写完成后,会向申请人发送一封电子邮件,并附上他选择作为pdf附件的课程的费用报价.我正在使用TCPDF并使用会话变量将数据从表单传递到库.内容采用 html 格式.生成PDF并根据需要作为附件发送.问题是它是空白的..只有页眉和页脚在文档中.在 linux 中尤…

数据库同步传输软件

Navicat转载于:https://www.cnblogs.com/jizl/p/4995959.html

DoNet 高效开发必备开发工具

工欲善其事&#xff0c;必先利其器&#xff0c;没有好的工具&#xff0c;怎么能高效的开发出高质量的代码呢&#xff1f;本文为 ASP.NET 开发者介绍一些高效实用的工具&#xff0c;包括 SQL 管理&#xff0c;VS插件&#xff0c;内存管理&#xff0c;诊断工具等&#xff0c;涉及…

php eval 语法错误,PHP eval和捕获错误(尽可能多)

我找到了一个很好的替代方案/答案 .首先&#xff0c;让我首先说当我设置error_reporting(E_ALL)时&#xff0c;nikic的建议有效;通知显示在PHP输出中&#xff0c;并且由于OB&#xff0c;它们可以被捕获 .接下来&#xff0c;我发现了这个非常有用的代码&#xff1a;/*** Check t…

防止表单重复提交的解决方案整理

用户在操作表单Post数据时往往会出现表单数据重复提交的问题&#xff0c;尤其在Web开发中此类问题比较常见。刷新页面&#xff0c;后退操作以前的页面&#xff0c;单机多次按钮都会导致数据重复提交。此类问题是因为浏览器重复提交HTTP请求导致。下面列出了四种比较常用的解决方…

免费字典api ,查询汉字完整信息

最大最全的新华汉语词典&#xff0c;字典api根据接口列表返回的汉字id&#xff0c;查询汉字完整信息。 接口名称&#xff1a;字典api 接口平台&#xff1a;第三方api 接口地址&#xff1a;http://v.juhe.cn/xhzd/queryid 支持格式&#xff1a;json/xml 请求方式&#xff1a;htt…

python正则去除换行符,关于python:用于删除换行符的正则表达式

我是Python的新手&#xff0c;我遇到了正则表达式问题。 我正在尝试删除文本文件中每行末尾的换行符&#xff0c;但前提是它跟在小写字母后面&#xff0c;即[a-z]。 如果该行的结尾以小写字母结尾&#xff0c;我想用空格替换换行符/换行符。这是我到目前为止所得到的&#xff1…

收集一些程序员励志经典名言

1、作为一个真正的程序员&#xff0c;首先应该尊重编程&#xff0c;热爱你所写下的程序&#xff0c;他是你的伙伴&#xff0c;而不是工具。2、程序员可以让步&#xff0c;却不可以退缩&#xff0c;可以羞涩&#xff0c;却不可以软弱&#xff0c;总之&#xff0c;程序员必须是勇…

Android develop 国际化

转自别人的一片文章&#xff0c;出处以找不到了&#xff0c;觉得写得不错&#xff0c;记录一下 一、概念 1.Internationalization(I18N) 国际化 使得App在不改的源码、资源文件的情况下&#xff0c;能够适应各国、各文化、各语言 是L10N的基础 2.Localization(L10N) 本地化 为A…

php留言板记录ip,如何用php程序记录来访IP

如何用php程序记录来访IP关注:226 答案:4 手机版解决时间 2021-02-16 00:05提问者失夜久伴你2021-02-15 01:22如何用php程序获取来访IP&#xff0c;然后保存在txt文件中,并且只保留最新的30个数据.最佳答案二级知识专家追尋☆①秒方向2021-02-15 02:19有一个全局的变量&#…

【基础】jquery全选、反选、全不选代码

1、JS代码function ($) {//全选 反选 全不选$("#selAll").click(function () {$(".lists :checkbox").not(:disabled).prop("checked", true);});$("#unSelAll").click(function () {$(".lists :checkbox").not(:disabled).…

oracle 11g重新安装配置,Oracle 11g数据库安装和卸载教程

Oracle11g的安装教程同时解压缩两个zip文件&#xff0c;生成一个database文件夹&#xff0c;进入到database文件夹&#xff0c;点击setup去掉安全更新的选项&#xff0c;直接下一步选择创建和配置数据库&#xff0c;点击下一步选择服务器类&#xff0c;点击下一步选择单例数据库…

C语言中strdup函数使用方法

头文件&#xff1a;#include <string.h> 定义函数&#xff1a;char * strdup(const char *s); 函数说明&#xff1a;strdup()会先用malloc()配置与参数s 字符串相同的空间大小&#xff0c;然后将参数s 字符串的内容复制到该内存地址&#xff0c;然后把该地址返回。该地址…

高级程序员和低级程序员的区别

低级程序员认为自己与高级程序员的区别, 主要是高级程序员任何功能都能编码实现, 编码速度快, 代码无 bug. 正如一惯的那样, 低级程序员之所以低级, 正是因为他们勉强能看到(或者根本看不到)事物的表象而看不到本质. 所以, 低级程序员总结出的一切东西, 你都可以大胆的忽略。所…

oracle中的tx锁影响查询吗,如何找到TM锁对应的TX锁?

我昨天也这样试过&#xff0c;但出来的结果和预料相差很远。wyqORCL>update emp set ename ename;12 rows updated.wyqORCL>get lockline 16 truncated.1 /* showalllock.sql */2 column username format a63 column object_name format a134 column o_name format …

IISExpress Log 文件路径

问题 用VS做开发时经常用IISExpress测试web程序&#xff0c;那么在测试过程中生成的Log文件放在哪里了&#xff1f; 答案 情况1 默认情况下 applicationhost.config 文中定义了连个日志文件路径&#xff1a;IIS_USER_HOME&#xff08;即%userprofile%\documents\IISExpress\&am…

程序员职业路线图

今天分享一张程序员职业路线图&#xff1a;欢迎关注我的公众号&#xff08;同步更新文章&#xff09;&#xff1a;DoNet技术分享平台阅读原文

jqgrid编辑php,php – 实现jqgrid单元格编辑datepicker

我知道使用datepicker进行单元格编辑是可能的,因为引用了here和here.但是,当我单击单元格时,没有出现日期选择器.下面是相关列的colModel条目.我有datepicker UI可用.在其他示例中,dataInit不包含引号.它在我的代码中,因为整个colModel是在AJAX请求期间由PHP动态创建的.我将它构…

C#编程规范整理

小编整理了一些C#编程的一些规范&#xff0c;希望对大家有点用处&#xff01;1、命名方式Pascal命名法&#xff1a;每个单词首字母均大写。Camel命名法&#xff1a;第一个单词首字母小写&#xff0c;其余单词首字母大写。2、有关类的规范1、使用 Pascal 大小写。2、用名词或名词…