【贪心】【后缀自动机】Gym - 101466E - Text Editor
题意:给你两个串A,B,以及一个整数K,让你找到B的一个尽可能长的前缀,使得其在A串中出现的次数不小于K次。
对A串建立后缀自动机,然后把B串放在上面跑,由于每到一个结点,该结点endpos集合的大小就是该前缀出现的次数,又由于较长前缀的出现次数不大于较短前缀,所以只要跑到不满足条件停下即可。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define MAXL 100000
- #define MAXC 300
- int v[2*MAXL+10],__next[2*MAXL+10],first[2*MAXL+10],e;
- void AddEdge(int U,int V){
- v[++e]=V;
- __next[e]=first[U];
- first[U]=e;
- }
- char s[MAXL+10];
- int len;
- struct SAM{
- int endcnt[2*MAXL+10];
- int n,maxlen[2*MAXL+10],minlen[2*MAXL+10],trans[2*MAXL+10][MAXC],slink[2*MAXL+10];
- void clear(){
- for(int i=0;i<=n;++i){
- endcnt[i]=maxlen[i]=minlen[i]=slink[i]=first[i]=0;
- memset(trans[i],0,sizeof(trans[i]));
- }
- n=e=0;
- }
- int new_state(int _maxlen,int _minlen,int _trans[],int _slink){
- maxlen[n]=_maxlen;
- minlen[n]=_minlen;
- for(int i=0;i<MAXC;++i){
- if(_trans==NULL){
- trans[n][i]=-1;
- }
- else{
- trans[n][i]=_trans[i];
- }
- }
- slink[n]=_slink;
- return n++;
- }
- int add_char(char ch,int u){
- if(u==-1){
- return new_state(0,0,NULL,-1);
- }
- int c=ch;
- int z=new_state(maxlen[u]+1,-1,NULL,-1);
- endcnt[z]=1;
- int v=u;
- while(v!=-1 && trans[v][c]==-1){
- trans[v][c]=z;
- v=slink[v];
- }
- if(v==-1){
- minlen[z]=1;
- slink[z]=0;
- return z;
- }
- int x=trans[v][c];
- if(maxlen[v]+1==maxlen[x]){
- minlen[z]=maxlen[x]+1;
- slink[z]=x;
- return z;
- }
- int y=new_state(maxlen[v]+1,-1,trans[x],slink[x]);
- slink[y]=slink[x];
- minlen[x]=maxlen[y]+1;
- slink[x]=y;
- minlen[z]=maxlen[y]+1;
- slink[z]=y;
- int w=v;
- while(w!=-1 && trans[w][c]==x){
- trans[w][c]=y;
- w=slink[w];
- }
- minlen[y]=maxlen[slink[y]]+1;
- return z;
- }
- void dfs(int U){
- for(int i=first[U];i;i=__next[i]){
- dfs(v[i]);
- endcnt[U]+=endcnt[v[i]];
- }
- }
- void work_slink_tree(){
- for(int i=1;i<n;++i){
- AddEdge(slink[i],i);
- }
- dfs(0);
- }
- }sam;
- typedef long long ll;
- char s2[MAXL+10];
- int len2,K;
- int main(){
- gets(s);
- len=strlen(s);
- int U=sam.add_char(0,-1);
- for(int i=0;i<len;++i){
- U=sam.add_char(s[i],U);
- }
- sam.work_slink_tree();
- gets(s2);
- len2=strlen(s2);
- scanf("%d",&K);
- int ans=0;
- U=0;
- for(int i=0;i<len2;++i){
- if(sam.endcnt[U]<K){
- ans=i-1;
- goto OUT;
- }
- else if(sam.trans[U][s2[i]]==-1){
- ans=i;
- goto OUT;
- }
- U=sam.trans[U][s2[i]];
- }
- ans=len2;
- if(sam.endcnt[U]<K){
- ans=len2-1;
- goto OUT;
- }
- OUT:
- if(ans==0){
- puts("IMPOSSIBLE");
- }
- else{
- for(int i=0;i<ans;++i){
- putchar(s2[i]);
- }
- puts("");
- }
- return 0;
- }
【贪心】【后缀自动机】Gym - 101466E - Text Editor的更多相关文章
- BZOJ3998 TJOI2015 弦论 【后缀自动机】【贪心】
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
- 【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word
题意:给你一个串,让你从左到右构造这个串,一次操作可以直接在当前串后面添加一个任意字符,或者拷贝当前串的任意一个子串到当前串的后面.问你最少要多少次操作才能构造出这个串. 从前向后贪心,从当前已构造的 ...
- BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机+贪心
BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机 Description FJ刚刚和邻居发生了一场可怕的争吵,他咽不下这口气,决定佚名发给他的邻居 一封脏话连篇的信. ...
- BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
- 一文读懂后缀自动机 Suffix_Automata
原论文(俄文)地址:suffix_automata 原翻译(中文)地址:后缀自动机详解(DZYO的博客) Upd:强推浅显易懂(?)的SAM讲解 后缀自动机 后缀自动机(单词的有向无环图)--是一种强 ...
- 后缀自动机(SAM)+广义后缀自动机(GSA)
经过一顿操作之后竟然疑似没退役0 0 你是XCPC选手吗?我觉得我是! 稍微补一点之前丢给队友的知识吧,除了数论以外都可以看看,为Dhaka和新队伍做点准备... 不错的零基础教程见 IO WIKI ...
- poj2774 Long Long Message(后缀数组or后缀自动机)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Long Long Message Time Limit: 4000MS Me ...
- [模板] 后缀自动机&&后缀树
后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...
- APIO 2014 回文串(Manacher+后缀自动机+倍增)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动 ...
随机推荐
- linux下使用indent整理代码(代码格式化)【转】
转自:https://blog.csdn.net/jiangjingui2011/article/details/7197069 常用的设置: indent -npro -kr -i8 -ts8 -s ...
- 13-6_mysql索引_1_Mysql_Learning_Notes_20180719_13-6
mysql索引_1_Mysql_Learning_Notes 二分查找/折半查找法,binary search 一种在有序数组中查找某一特定元素的搜索算法; 二分查找法的优点是比较少次数,查找速度快, ...
- 使用Scrapy命令行工具【导出JSON文件】时编码设置
Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 使用scrapy命令行工具建立了爬虫项目(startproject),并使用s ...
- 数据库-mysql中文显示问题
一:在mysql 下面查看带中文的记录显示乱码 mysql> select * from role; +----+------+ | id | name | +----+------+ | 1 ...
- JsRender 前端渲染模板常用API学习
JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的,使用的情况有以下几种. 把html字符串编译编译成模板 获取使用script标签声 ...
- 关闭linux退格键和vi发出的嘟嘟声
以root用户登录,然后请安下面方法进行操作: 在命令行下执行:echo "rmmod pcspkr" >> /etc/rc.d/rc.local
- 首次加载进来DEV控件列表第一行颜色总是不对,后台代码显示的数据正确
1:行改变的颜色正确的颜色: 1.1颜色效果如下图: 1.2:设置行改变颜色: 2:结果首次加载第一行颜色为: 3:解决方案: 3.1 :Views-->OptionsSelection --& ...
- django 建立一个简单的应用
本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...
- 浅谈malloc/free和new/delete 的区别
malloc和new的区别 malloc是库函数,需要包头文件才能成功运行编译:new是操作符(C++中的关键字),需要在C++的环境下使用. malloc既可以在C语言中使用也可以在C++中使用,n ...
- 关于jedis2.4以上版本的连接池配置,及工具类
jedis.propertise 注意以前版本的maxAcitve和maxWait有所改变,JVM根据系统环境变量ServerType中的值 取不同的配置,实现多环境(测试环境.生产环境)集成. re ...