思路

考虑一个匹配的过程,当一个节点x向后拼接一个c的时候,为了满足题目条件的限制,应该向suflink中最深的len[x]+1>=k的节点转移(保证该后缀拼上一个c之后,长度为k的子串依然属于模板串的子串),然后拓扑求最长链即可,出现环就输出INF

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int Nodecnt,trans[250000][26],suflink[250000],maxlen[250000],n,k;
char s[250000];
int New_state(int _maxlen,int *_trans,int _suflink){++Nodecnt;maxlen[Nodecnt]=_maxlen;if(_trans)for(int i=0;i<26;i++)trans[Nodecnt][i]=_trans[i];suflink[Nodecnt]=_suflink;return Nodecnt;
}
int add_len(int u,int c){if(trans[u][c]){int v=trans[u][c];if(maxlen[v]==maxlen[u]+1){return v;}int y=New_state(maxlen[u]+1,trans[v],suflink[v]);suflink[v]=y;while(u&&trans[u][c]==v){trans[u][c]=y;u=suflink[u];}return y;}else{int z=New_state(maxlen[u]+1,NULL,0);while(u&&trans[u][c]==0){trans[u][c]=z;u=suflink[u];}if(!u){suflink[z]=1;return z;}int v=trans[u][c];if(maxlen[v]==maxlen[u]+1){suflink[z]=v;return z;}int y=New_state(maxlen[u]+1,trans[v],suflink[v]);suflink[z]=suflink[v]=y;while(u&&trans[u][c]==v){trans[u][c]=y;u=suflink[u];}return z; }
}
int in[250000],use[250000],v[250000],nxt[250000],fir[250000],cnt,dp[250000];
void init(void){Nodecnt=1;memset(trans,0,sizeof(trans));memset(suflink,0,sizeof(suflink));memset(maxlen,0,sizeof(maxlen));memset(in,0,sizeof(in));memset(use,0,sizeof(use));cnt=0;memset(v,0,sizeof(v));memset(nxt,0,sizeof(nxt));memset(fir,0,sizeof(fir));memset(dp,0,sizeof(dp));
}
void addedge(int ui,int vi){++cnt;v[cnt]=vi;nxt[cnt]=fir[ui];fir[ui]=cnt;
}
void dfs(int u){if(use[u]){for(int i=0;i<26;i++){if(trans[u][i]&&use[trans[u][i]])in[trans[u][i]]++;else{int p=u;while(p&&(trans[p][i]==0||maxlen[p]+1<k))p=suflink[p];trans[u][i]=trans[p][i];in[trans[p][i]]++;}}for(int i=fir[u];i;i=nxt[i])dfs(v[i]);}elsefor(int i=fir[u];i;i=nxt[i])dfs(v[i]);
}
queue<int> q;
int topu(void){while(!q.empty())q.pop();for(int i=1;i<=Nodecnt;i++)use[i]=(maxlen[i]>=k),addedge(suflink[i],i);dfs(1);int num=0;for(int i=1;i<=Nodecnt;i++){num+=use[i];if(use[i]&&(!in[i]))q.push(i),dp[i]=maxlen[i];}if(!num)return k-1;if(q.empty())return 0x3f3f3f3f;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<26;i++){if(trans[x][i]){dp[trans[x][i]]=max(dp[trans[x][i]],dp[x]+1);in[trans[x][i]]--;if(!in[trans[x][i]])q.push(trans[x][i]);}}}int ans=0;for(int i=1;i<=Nodecnt;i++)if(use[i]&&in[i])return 0x3f3f3f3f;elseans=max(ans,dp[i]);return ans;
}
int main(){while(scanf("%d %d",&n,&k)==2){init();for(int i=1;i<=n;i++){scanf("%s",s+1);int len=strlen(s+1),last=1;for(int j=1;j<=len;j++)last=add_len(last,s[j]-'a');}int t=topu();if(t==0x3f3f3f3f){printf("INF\n");}else{printf("%d\n",t);}}return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10751207.html

BZOJ 5261 Rhyme相关推荐

  1. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  2. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  3. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  4. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  5. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  6. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  7. 【UVA/Codeforces】1584 Circular Sequence / 792B Counting-out Rhyme(就是一个圈儿...)

    https://vjudge.net/problem/UVA-1584 1584 Circular Sequence 输入一个字符串,可以以字符串中任意一个字母作为起始,输出字典序最小的那个字符串 两 ...

  8. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...

  9. BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...

  10. BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://hydro.ac/d/bzoj/p/1589 Problem 每年万圣 ...

最新文章

  1. php面向对象调用方法,在面向对象的php中调用方法
  2. 简单实现支付密码输入框 By HL
  3. 成功解决ImportError: cannot import name 'PILLOW_VERSION'
  4. 面向对象编程--之二
  5. 【练习】2021下半年数据结构刷题笔记和总结 (二) 树、查找-- 不同的排序算法、二叉排序树 平衡二叉树、哈希表查找、线索二叉树、
  6. 三件套都有什么_床上用品三件套、四件套、21件套都各指什么啊?
  7. 常用宏定义 - 系统相关
  8. Java加密与解密的艺术~安全协议~单向认证服务
  9. 【機器學習筆記】xgboost中的min_child_weight參數理解。
  10. latex for wordpress(一)
  11. Spark的简介和在大数据领域的地位
  12. 【POJ 3666】Making the Grade【线性DP】
  13. py将dicm格式图片转为jpg格式
  14. PHP之封装梦网云通讯短信发送类
  15. 安装VMware时勾选增强型键盘驱动程序有什么用?
  16. 用CSS实现花里胡哨的按钮切换效果
  17. flex:1代表什么意思
  18. WPF实现VS界面效果
  19. 没有基础可以学java吗?零基础学java
  20. vpb在VS2008下的配置编译

热门文章

  1. Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
  2. Python入门之面向对象module,library,package之间区别
  3. spring中context:property-placeholder
  4. 探讨e.target与e.currentTarget
  5. MongoDB数据库的索引操作(转)
  6. JAVA练习题1(初级基本数据类型、运算符)
  7. js的深拷贝的理解和实现
  8. Kattis - missinggnomesD Missing Gnomes (思路题)
  9. dreamweaver代码提示失效
  10. 找不到该项目,请确认该项目的位置的办法(转)