题目:

https://loj.ac/problem/6158

分析:

先把S串逆置,就是从低位向高位看

我们再弄个T串,S串前面有x个连续的0,那么T串前面也有x个连续的0

第x+1位,满足S[x+1]+T[x+1]=10

后面的位置,均满足S[j]+T[j]=9

然后我们发现S的每一个后缀S[i]与T串进行匹配,求个最长的前缀就是当前在这个位置劈开的结果

这个是个典型的扩展KMP的应用,即对于S、T串,求S的每个后缀S[i]与T的最长公共前缀

本题有几点细节

1、因为最高位之前的那些位置都是0,所以在S串的后面,需要加上一些0

2、要注意当某个S[i]和T的最长公共前缀超过了i的位置,那么超过i的那些位置并不是我们想要的,实际上,那些应该是99999999……或者000000........

所以可以预处理出S的每一位后面有多少连续的0和多少个连续的9

 #include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=1e6;
char S[*maxn+],T[maxn+];//S是母串,T是子串
int len1,len2;
int next[maxn+],extend[*maxn+];//extend[i]表示S[i..len1-1]和T的最长公共前缀的长度,next[i]表示T[i..len2-1]和T的最长公共前缀的长度
int num9[maxn+];
int num0[maxn+];
void getnext()
{
next[]=len2;
int j=;
while(j+<len2&&T[j]==T[j+]) ++j;
next[]=j;
int k=;
for(int i=;i<len2;++i)
{
int p=k+next[k]-,l=next[i-k];
if(i+l<p+) next[i]=l;
else
{
j=max(p-i+,);
while(i+j<len2&&T[i+j]==T[j]) ++j;
next[i]=j;
k=i;
}
}
}
void ekmp()
{
int j=;
while(j<len1&&j<len2&&S[j]==T[j]) ++j;
extend[]=j;
int k=;
for(int i=;i<len1;++i)
{
int p=k+extend[k]-,l=next[i-k];//p表示到达的最远位置,k是对应最远位置的i
if(i+l<p+) extend[i]=l;
else
{
j=max(p-i+,);
while(i+j<len1&&j<len2&&S[i+j]==T[j]) ++j;
extend[i]=j;
k=i;
}
}
}
int main()
{ while (scanf("%s",S)!=EOF)
{
len1=strlen(S);
for(int i=;i<len1/;++i) swap(S[i],S[len1-i-]);
int i=;
for(i=;S[i]=='';++i) T[i]='';
T[i]=''+-S[i]+'';
++i;
for(i;i<len1;++i)
T[i]=''-S[i]+'';
T[len2=len1]='\0';
for(int i=len1;i<len1+len2;++i) S[i]='';
S[len1+len2]='\0';
len1=strlen(S);
memset(num9,,sizeof(num9));
memset(num0,,sizeof(num0));
for(int i=len2-;i>=;--i)
{
if(S[i+]!='') num9[i]=;else num9[i]=num9[i+]+;
if(S[i+]!=''||i==len2-) num0[i]=;else num0[i]=num0[i+]+;
}
memset(next,,sizeof(next));
memset(extend,,sizeof(extend));
getnext();
ekmp();
int ans=;
for(int i=;i<len2;++i)
{
if(extend[i]>=i)
{
if(S[i]==''&&num0[i]>=i-) ans=max(ans,num0[i+i-]+i);
else ans=max(ans,num9[i+i-]+i);
}
else
ans=max(ans,extend[i]);
}
printf("%d\n",ans);
}
return ;
}

loj6158 A+B Problem (扩展KMP)的更多相关文章

  1. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  2. 字符串(扩展KMP):HDU 4333 Revolving Digits

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. hdu 4300 Clairewd’s message(扩展kmp)

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

  4. A - A Secret (扩展kmp)

    题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...

  5. hdu4300 Clairewd’s message 扩展KMP

    Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...

  6. HDU 6153 扩展kmp

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  7. hdu4333 Revolving Digits(扩展kmp)

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. J - Clairewd’s message HDU - 4300(扩展kmp)

    题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...

  9. HDU 6153 A Secret(扩展kmp)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

随机推荐

  1. js获取服务器生成并返回客户端呈现给客户的控件id的方法

    var repeaterId = '<%=rpData.ClientID %>'; //Repeater的客户端IDvar rows = <%=rpData.Items.Count% ...

  2. powerDesigner 一些设置

    常用设置 table中需要显示的内容 --------------------------------------------------------------------------------- ...

  3. ZGC,一个超乎想象的垃圾收集器

    Z Garbage Collector,即ZGC,是一个可伸缩的.低延迟的垃圾收集器,主要为了满足如下目标进行设计: 停顿时间不会超过10ms 停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在1 ...

  4. 通过JS加载XML文件,跨浏览器兼容

    引言 通过JS加载XML文件,跨多种浏览器兼容. 在Chrome中,没有load方法,需要特殊处理! 解决方案 部分代码 try //Internet Explorer { xmlDoc=new Ac ...

  5. project .mpp 查看当天工作任务 1.选择自己 2.选择起始和终止时间 就显示当天的任务了

    project .mpp 查看当天工作任务 1.选择自己 2.选择起始和终止时间 就显示当天的任务了

  6. error C2143: 语法错误 : 缺少“;”(在“&”的前面)

    报错: error C2143: 语法错误 : 缺少“;”(在“&”的前面) 代码: #include <iostream> ostream & << (ost ...

  7. 微信公众号:theTree20181123

    哈哈哈哈~我开通了一个微信公众号,以后的文章会发在公众号内啦~走过路过的小伙伴们过来围观一下呀~~ 主要是分为三个模块:视觉SLAM,ACM,变美树洞 这里面写下来的文章都是我再读研阶段的所学所想当然 ...

  8. 配置maven报错 the java_home environment variable is not defined correctly ......

    the java_home environment variable is not defined correctly This environment variable is needed to r ...

  9. ios之sqllite3简单使用

    SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加到内存中. 基本操作: (1)打开或者创建数据库 sqlite3 *database; i ...

  10. Android开发中JavaBean类和序列化知识的理解

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/6296121.html Android开发中,我们经常用到JavaBean类以及序列化的知识,但经 ...