BOJ 480 田田背课文
题意:给出一个字符串,求出一个最短的只出现一次的子串的长度。
思路:利用后缀数组,我们能求得最长的重复子串。那该长度加一就是最短的只出现一次的子串的长度。
代码如下:
#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 田田背课文相关推荐
- 困了。还得背课文。变词型
真困.明天上午和晚上有课.下午干什么呢? 转载于:https://www.cnblogs.com/zxsoft/archive/2007/08/09/848517.html
- BOJ 438 田田的公司
题意:给出n个公司和他们各自的实力值.有两种操作:合并两个公司,形成联盟.查询一个公司对应联盟的实力值的总和. 思路:裸的并查集.注意一点,可能会对已经是同一个联盟的公司再次合并,所以在合并时,需要判 ...
- BOJ 451 田田的算术题
题意:给出一个数列.有两个操作:1.将给定范围内的项按照顺序加上一个等差数列的项.2.求出给定范围的数列项的和. 思路1:区间更改和区间求和的操作,很容易想到了线段树.由于等差数列满足可加性(即对相同 ...
- Asce‘s Summer Ranking No.11
赶交题解时间,这场a和d只说思路,代码没A呢都 A. 小妹妹个数 2014新生暑假个人排位赛11 时间限制 3000 ms 内存限制 65536 KB 题目描述 喜欢焦叔叔的小妹妹实在是太多了,以至于 ...
- 想学好编程,别背代码!
分享我编程 "不忘" 的十几种方法 大家好,我是鱼皮. 最近私信收到最多的问题就是:我学编程的时候记不住代码,老忘怎么办? 比如这位小伙伴,学编程一个月了,问我咋背代码: 其实,我 ...
- 【考研英语】作文只是背模板?正确复习姿势了解下
冲刺阶段,大家都在问英语作文该怎么复习.难道作文真的只是背几篇模板范文就行了吗?答案当然是否定的.作文不要放松警惕,有效的复习才能在考场秒杀对手.下面是作文复习的方法,看看吧. 之前给大家的复习建议, ...
- 学校几年级要带加减计算机,一年级家长朋友们看过来,有多少孩子的数学老师要求背加减法...
从上幼儿园开始,老师就要求背诵加减法,分合式.我一直没执行过. 上了小学,老师布置的作业也有背诵加减法,我偶尔有让小猪背过. 我一直认为数学不应该是背诵的一门学科.但这次开家长会,老师又强调了,背诵加 ...
- 广告有哪些方式,可以降低用户反感?
---- / BEGIN / ---- "广告,烦!" 就广告内容而言,用户可能因为5个因素反感. 我们有哪些方式,可以降低用户反感?--本文主题 今年九月底,蚂蚁财富联合16家基 ...
- 人生就是不停的战斗————九把刀北大演讲 转载自豆瓣网友“此间的少年”
时间:2011年11月5日 地点:北京大学2号楼205 主题:人生就是不停的战斗 手打组:中财刘铮,魏文婷 请尊重手打组作品,转载勿删除手打组. 非常非常开心能够来北京大学演讲,我能表现出的最大的诚意 ...
最新文章
- 散列(哈希 hash)
- qt creator 构建(build) 执行cmake 部署的区别?(未解决)
- 研究生开题报告需要注意的几点
- c语言字符串未初始化strcat,C语言中字符串常用函数strcat与strcpy的用法介绍
- 详解AST抽象语法树
- 迭代列表不要For循环,这是Python列表推导式最基本的概念
- Rectangles
- 使括号有效的最少添加
- django基础入门(3)django中模板
- 丹尼斯·里奇的自述简历
- 新手试炼:C语言实现加密版2-4阶行列式运算!
- python股票行情接口实时获取股市数据
- pcre2 知:介绍
- Does love become hate or forgiveness after a double deviation?文章阅读
- model.evaluate中的verbose的作用
- 倪衡:大数据时代小微企业质量管理创新
- Chrome(谷歌浏览器) 程序开发32个经常使用插件
- 利用OPENCV创作梵高艺术风格图片
- 思科、华为交换机链路聚合(LACP)配置实例
- 【深度学习】步态识别-论文阅读:(T-PAMI-2021)综述:Deep Gait Recognition
热门文章
- 2021高考宣威二中成绩查询,别了,母校!宣威第二中学举行高考送考仪式
- ExoPlayer实现4G网络下暂停缓存功能
- 如何在pdf文件里批量添加文字
- 不锈钢袋式过滤器详细说明
- ppt手动放映怎么设置_为什么ppt已经设置了手动放映还是自动播放呢
- i3 9100f配什么主板
- 《经济学人 —— 人工智能专题报告》
- 人工智能的“无间道”通向何方
- python Name Entity Recognition(NER) extract company name 命名实体识别 提取公司名
- 腾讯QQ实用技巧一箩筐 必有你所需