loj6158 A+B Problem (扩展KMP)
题目:
分析:
先把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)的更多相关文章
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- 字符串(扩展KMP):HDU 4333 Revolving Digits
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 4300 Clairewd’s message(扩展kmp)
Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...
- A - A Secret (扩展kmp)
题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...
- hdu4300 Clairewd’s message 扩展KMP
Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...
- HDU 6153 扩展kmp
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- hdu4333 Revolving Digits(扩展kmp)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- J - Clairewd’s message HDU - 4300(扩展kmp)
题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
随机推荐
- Proteus与Keil连接及其仿真(有例子哦!)
记录一下Proteus仿真的一些设置和使用,以方便自己以后复习和大家交流!如有错误,希望大家指正. 1.Proteus软件的安装,这里就不作说明了.
- Hadoop 常用命令之 HDFS命令
命令 说明 hadoop fs -mkdir 创建HDFS目录 hadoop fs -ls 列出HDFS目录 hadoop fs -copyFromLocal 使用-copyFromLocal 复制本 ...
- 深入理解Java的整型类型:如何实现2+2=5?
先看下这段神奇的Java代码: public static void main(String[] args) throws Exception { doSomethingMagic(); System ...
- centOS7安装 mysql-community-release-el7-5.noarch.rpm 包
一.rpm包 1.wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm(下载rpm) 2.rpm -ivh mysql ...
- 第4节 hive调优:动态分区调整问题
执行如下截图中的语句时卡住了: 原因:yarn未启动,hive底层是要提交mapreduce到yarn上才能计算结果的. 之前启动yarn时,未执行jps查看是否已经启动.其实未启动成功: [root ...
- [BZOJ3207]:花神的嘲讽(分块解法)
题目传送门 题目描述:背景花神是神,一大癖好就是嘲讽大J,举例如下:“哎你傻不傻的![hqz:大笨J]”“这道题又被J屎过了!!”“J这程序怎么跑这么快!J要逆袭了!”…… 描述这一天DJ在给吾等众蒟 ...
- LayuI固定块关闭
1.近期项目使用了layui的固定块,但是当到某个独立页面时,固定块还在,就显得突兀: 2.通过F12查看,发现代码: <ul class="layui-fixbar" st ...
- 717. 1-bit and 2-bit Characters@python
We have two special characters. The first character can be represented by one bit 0. The second char ...
- CF528D Fuzzy Search 字符串匹配+FFT
题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...
- python 06 8/28-8/30
六 函数的返回值,使用return返回数据,可以同时返回多个数据,将会以元组的形式返回到函数的调用处.return 具有返回数据和中止程序的作用! return 后不加任何数据则返回None ,判定为 ...