题意:给出一个字符串,求出一个最短的只出现一次的子串的长度。

思路:利用后缀数组,我们能求得最长的重复子串。那该长度加一就是最短的只出现一次的子串的长度。

代码如下:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>using namespace std;const int MAX = 1000100;void radix(int * str, int *a, int *b, int n, int m){static int count[MAX];memset(count,0,sizeof(count));for(int i = 0; i < n; ++i) ++count[str[a[i]]];for(int i = 1; i <= m; ++i) count[i] += count[i-1];for(int i = n -1; i >= 0; --i) b[--count[str[a[i]]]] = a[i];
}void suffix_array(int* str,int * sa, int n, int m)
{static int rank[MAX],a[MAX],b[MAX];for(int i = 0; i < n; ++i) rank[i] =i;radix(str,rank,sa,n,m);rank[sa[0]] = 0;for(int i = 1; i < n; ++i)rank[sa[i]]= rank[sa[i-1]] +(str[sa[i]]!=str[sa[i-1]]);for(int i = 0; 1<<i< n; ++i){for(int j = 0; j < n; ++j){a[j] = rank[j]+1;b[j] = j + (1<<i) >=n? 0: rank[j + (1<<i)] + 1;sa[j] = j;}radix(b,sa,rank,n,n);radix(a,rank,sa,n,n);rank[sa[0]] = 0;for(int j = 1; j < n; ++j){rank[sa[j]] = rank[sa[j-1]] + (a[sa[j-1]] != a[sa[j]] || b[sa[j-1]] != b[sa[j]]);}}
}int duplicate_substr(string str)
{string rev;static int s[MAX],sa[MAX],rank[MAX],h[MAX];int n = str.length();copy(str.begin(),str.end(),s);suffix_array(s,sa,n,256);for(int i = 0 ; i < n; ++i)rank[sa[i]] = i;int k = 0;int ans1 =0,pos1 = 0;for(int i = 0; i < n; ++i){k = k==0? 0: k - 1;while(rank[i] > 0 && s[i + k] == s[sa[rank[i] - 1] + k]) ++k;h[rank[i]] = k;if(h[rank[i]] > ans1){ans1 = h[rank[i]];pos1 = i;}}return str.substr(pos1,ans1).length();
}int main(void)
{int T;string str;while(cin>>str){cout<<duplicate_substr(str) + 1<<'\n';}return 0;
}

BOJ 480 田田背课文相关推荐

  1. 困了。还得背课文。变词型

    真困.明天上午和晚上有课.下午干什么呢? 转载于:https://www.cnblogs.com/zxsoft/archive/2007/08/09/848517.html

  2. BOJ 438 田田的公司

    题意:给出n个公司和他们各自的实力值.有两种操作:合并两个公司,形成联盟.查询一个公司对应联盟的实力值的总和. 思路:裸的并查集.注意一点,可能会对已经是同一个联盟的公司再次合并,所以在合并时,需要判 ...

  3. BOJ 451 田田的算术题

    题意:给出一个数列.有两个操作:1.将给定范围内的项按照顺序加上一个等差数列的项.2.求出给定范围的数列项的和. 思路1:区间更改和区间求和的操作,很容易想到了线段树.由于等差数列满足可加性(即对相同 ...

  4. Asce‘s Summer Ranking No.11

    赶交题解时间,这场a和d只说思路,代码没A呢都 A. 小妹妹个数 2014新生暑假个人排位赛11 时间限制 3000 ms 内存限制 65536 KB 题目描述 喜欢焦叔叔的小妹妹实在是太多了,以至于 ...

  5. 想学好编程,别背代码!

    分享我编程 "不忘" 的十几种方法 大家好,我是鱼皮. 最近私信收到最多的问题就是:我学编程的时候记不住代码,老忘怎么办? 比如这位小伙伴,学编程一个月了,问我咋背代码: 其实,我 ...

  6. 【考研英语】作文只是背模板?正确复习姿势了解下

    冲刺阶段,大家都在问英语作文该怎么复习.难道作文真的只是背几篇模板范文就行了吗?答案当然是否定的.作文不要放松警惕,有效的复习才能在考场秒杀对手.下面是作文复习的方法,看看吧. 之前给大家的复习建议, ...

  7. 学校几年级要带加减计算机,一年级家长朋友们看过来,有多少孩子的数学老师要求背加减法...

    从上幼儿园开始,老师就要求背诵加减法,分合式.我一直没执行过. 上了小学,老师布置的作业也有背诵加减法,我偶尔有让小猪背过. 我一直认为数学不应该是背诵的一门学科.但这次开家长会,老师又强调了,背诵加 ...

  8. 广告有哪些方式,可以降低用户反感?

    ---- / BEGIN / ---- "广告,烦!" 就广告内容而言,用户可能因为5个因素反感. 我们有哪些方式,可以降低用户反感?--本文主题 今年九月底,蚂蚁财富联合16家基 ...

  9. 人生就是不停的战斗————九把刀北大演讲 转载自豆瓣网友“此间的少年”

    时间:2011年11月5日 地点:北京大学2号楼205 主题:人生就是不停的战斗 手打组:中财刘铮,魏文婷 请尊重手打组作品,转载勿删除手打组. 非常非常开心能够来北京大学演讲,我能表现出的最大的诚意 ...

最新文章

  1. 散列(哈希 hash)
  2. qt creator 构建(build) 执行cmake 部署的区别?(未解决)
  3. 研究生开题报告需要注意的几点
  4. c语言字符串未初始化strcat,C语言中字符串常用函数strcat与strcpy的用法介绍
  5. 详解AST抽象语法树
  6. 迭代列表不要For循环,这是Python列表推导式最基本的概念
  7. Rectangles
  8. 使括号有效的最少添加
  9. django基础入门(3)django中模板
  10. 丹尼斯·里奇的自述简历
  11. 新手试炼:C语言实现加密版2-4阶行列式运算!
  12. python股票行情接口实时获取股市数据
  13. pcre2 知:介绍
  14. Does love become hate or forgiveness after a double deviation?文章阅读
  15. model.evaluate中的verbose的作用
  16. 倪衡:大数据时代小微企业质量管理创新
  17. Chrome(谷歌浏览器) 程序开发32个经常使用插件
  18. 利用OPENCV创作梵高艺术风格图片
  19. 思科、华为交换机链路聚合(LACP)配置实例
  20. 【深度学习】步态识别-论文阅读:(T-PAMI-2021)综述:Deep Gait Recognition

热门文章

  1. 2021高考宣威二中成绩查询,别了,母校!宣威第二中学举行高考送考仪式
  2. ExoPlayer实现4G网络下暂停缓存功能
  3. 如何在pdf文件里批量添加文字
  4. 不锈钢袋式过滤器详细说明
  5. ppt手动放映怎么设置_为什么ppt已经设置了手动放映还是自动播放呢
  6. i3 9100f配什么主板
  7. 《经济学人 —— 人工智能专题报告》
  8. 人工智能的“无间道”通向何方
  9. python Name Entity Recognition(NER) extract company name 命名实体识别 提取公司名
  10. 腾讯QQ实用技巧一箩筐 必有你所需