BZOJ1535: [POI2005]Sza-Template

1535: [POI2005]Sza-Template

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 240  Solved: 121
[Submit][Status]

Description

Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置不能喷涂不同的字符.做一个模版很费工夫,所以他想要模版的长度尽量小,求最小长度是多少.拿样例来说 ababbababbabababbabababbababbaba , 模版为前8个字符ababbaba, 喷涂的过程为: ababbababbabababbabababbababbaba

Input

输入一行最多不超过500 000 个最少1个小写字符.

Output

一个长度表示模版最小的长度.

Sample Input

ollowing input data:
ababbababbabababbabababbababbaba

Sample Output

8

HINT

Source

题解:

想了好长时间发现没想法,看了zrts的题解说是二分,既不懂为何满足单调性,又不懂如何判断一个前缀能否覆盖整个串(现在好像明白怎么覆盖了?扩展kmp?哪天去学学)

然后膜拜jcvb的题解:

覆盖用的串不能超出原串边界,且又要完全覆盖。所以合法串必然是原串前缀且是原串后缀。
KMP后可以得到一棵fail-tree,那么n到根路径上的一个结点对应一个可能合法的串。考虑其中某个串,其长度为len,它在原串的所有出现位置(结束位置)即为以这个结点的为根的子树。如果这个串能够不遗漏地覆盖原串,则它的所有出现位置中相邻两个的距离不超过len。
于是我们要对n到根路径上的每个结点,统计其子树内元素中相邻的差的最大值。考虑沿根下降,则子树元素从{1,2,..,n}开始不断减少。用一个双向链表维护当前属于子树的值,删除的同时更新相邻元素差的最大值。
总复杂度O(n),常数稍大。
看到网上的题解里有用二分的,表示理解不能。

真是巧妙的思路,双向链表保证了O(1)删除,维护相邻最大差值,从根下降保证了最大差值在增加。orz

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 550000
14 #define maxm 500+100
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 1000000007
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
28     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
29     return x*f;
30 }
31 int n,mx,ans,tot,nxt[maxn],pre[maxn],head[maxn],next[maxn];
32 char s[maxn];
33 struct edge{int go,next;}e[maxn];
34 bool can[maxn];
35 inline void insert(int x,int y)
36 {
37     e[++tot].go=y;e[tot].next=head[x];head[x]=tot;
38 }
39 void del(int x)
40 {
41     nxt[pre[x]]=nxt[x];
42     pre[nxt[x]]=pre[x];
43     mx=max(mx,nxt[x]-pre[x]);
44     for(int i=head[x];i;i=e[i].next)del(e[i].go);
45 }
46 void dfs(int x)
47 {
48     if(mx<=x){ans=x;return;}
49     int z=0;
50     for(int i=head[x],y;i;i=e[i].next)
51     if(!can[y=e[i].go])del(y);else z=y;
52     if(z)dfs(z);
53 }
54 int main()
55 {
56     freopen("input.txt","r",stdin);
57     freopen("output.txt","w",stdout);
58     scanf("%s",s+1);n=strlen(s+1);
59     insert(0,1);
60     for(int i=2,j=0;i<=n;i++)
61     {
62         while(j&&s[j+1]!=s[i])j=next[j];
63         if(s[j+1]==s[i])j++;
64         next[i]=j;
65         insert(j,i);
66     }
67     for(int i=n;i;i=next[i])can[i]=1;
68     for1(i,n)pre[i]=i-1,nxt[i]=i+1;
69     pre[1]=nxt[n]=0;
70     mx=1;
71     ans=n;
72     dfs(0);
73     printf("%d\n",ans);
74     return 0;
75 }

时间: 2024-10-27 01:17:46

BZOJ1535: [POI2005]Sza-Template的相关文章

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz

NET Core项目定义Item Template

NET Core项目定义Item Template 作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常有用的扩展点.这里我们主要关注Item Template,它时我们可以在"Add new Item"对话框中添加我们自定义的Item(如下图所示).如果不了解Item Template,Scott Gu的文章. 我们之前自定义了一些Ite

手把手教你创建Azure ARM Template

Azure的ARM模式在中国已经落地了.在ARM模式中,通过ARM的Template批量的创建各种资源是与ASM模式的最大的区别之一.目前Azure ARM的Template数量已经越来越多,更多的客户会选择采用Template的模式进行资源的部署: 在前面的文章中已经介绍了如何通过已有的Template修改成你所需要的模板,请参考: http://www.cnblogs.com/hengwei/p/5634380.html 本文将一步一步的创建一个最简单的存储账户的ARM Template,并

Backbone 模板 underscore template默认的转义符&lt;%= %&gt; 与jsp的冲

先定义转义符,因为默认的转义符<%= %> 与jsp的冲突(如果js模板写在jsp页面中)       _.templateSettings = { interpolate : /\{\{(.+?)\}\}/g }; 下面就可以这样写 <script type="text/template" id="detailedBar-template"> <div class='title'> <span class='label'&

ansible的playbook配置及template模板的使用

前言: 学习下ansible的playbooks的状态配置管理,说来puppet saltstack都有类似的叫法,只是ansible的叫法更犀利,我当时一看playbook还以为是花花公子的playboy.要使用ansible就要深入学习playbook配置及模板. 注:到底是playbook还是playbooks.... 先把官网的简单几个语法给说明下. #这个是你选择的主机 - hosts: webservers #这个是变量   vars:     http_port: 80     m

Spring mvc 中使用ftl引用共通文件出错 FreeMarker template error: Error reading included file &quot;/WEB-INF/ftl/common/errormessage.ftl&quot;

初次接触spring mvc,想做一个小的练习项目,结果在ftl文件中引用其它的共通ftl文件时出错. 目录结构如图所示,想在login.ftl中引用common下的errormessage.ftl <#include '/WEB-INF/ftl/common/errormessage.ftl' /> 结果画面报错: FreeMarker template error: Error reading included file "/WEB-INF/ftl/common/errormes

Spring Boot使用thymeleaf模板时报异常:template might not exist or might not be accessible by any of the configured Template Resolvers

错误如下: template might not exist or might not be accessible by any of the configured Template Resolvers 解决方法: 1.确定模板是否在默认templates文件夹里面,并且路径要和返回的View名字一致. 2.new ModelAndView("/log/loglist");这样写是不对的,应该把开头的斜杠去掉,改成:new ModelAndView("log/loglist&

HDOJ 1217 Floyed Template

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <cstring> 5 #include<map> 6 using namespace std; 7 8 map<string,int>name; 9 const int INF = 1000000; 10 const int MAXSIZE = 1005; 11 const int

微信小程序 模板template的使用

一.文件目录结构如下: 二.在house页面使用这些模板: 三.在house页面引入样式 四.定义模板文件 五.总结: 1.在模板文件中必须以name="模板名称" 如: <template name="HeaderNavTemplate">......</template> 包裹: 2.在引入模板页面.wxml页面中 <import src="../template/tpl-headerNav/tpl-headerNav.w