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 ...
随机推荐
- Summary of 2016 International Trusted Computing and Cloud Security Summit
1) Welcome Remarks 2) The advancement of Cloud Computing and Tursted Computing national st ...
- uva12265 Selling Land
见紫书.(c,h)的更新策略://前面的高度为0了,直接插入因为ans==-c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从 ...
- C-基础:memcpy、memset、memmove、memcmp、memchr
一,原型 void * memcpy ( void * destination, const void * source, size_t num ); 功能:将以source作为起始地址的数据复制nu ...
- DP || HYSBZ 1207 打鼹鼠
n*n的网格,有m个鼹鼠,t时间会有一只鼹鼠出现在(x,y)点处,如果机器人也在这个点就可以打到鼹鼠 机器人初始位置任意,每秒可以移动一格,问最多打到多少鼹鼠 *解法:f[i]表示前i只鼹鼠打了多少个 ...
- 连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
MySQL新版默认使用caching_sha2_password作为身份验证插件,而旧版是使用mysql_native_password.当连接MySQL时报错“plugin caching_sha2 ...
- EBS oracle 批量导入更新MOQ(最小拆分量、采购提前期、最小订购量、最小包装量)
EXCEL的列:组织id,供应商编号,供应商地点,料号,最小拆分量.采购提前期.最小订购量.最小包装量 --采购导入更新MOQ四个值,若有为空的那列,会保留原来的值,不会去更新那列的值 PROCEDU ...
- ZooKeeper运行原理和基本编程接口
什么是ZooKeeper ZooKeeper作为一个分布式的服务框架(与Google Chubby类似),主要用于解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数 ...
- mysql 数据库 show命令
MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1. show tables或show tables fr ...
- redis:哨兵集群配置
最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
- js多维数组扁平化
数组扁平化,就是将多维数组碾平为一维数组,方便使用. 一:例如,一个二维数组 var arr = ['a', ['b', 2], ['c', 3, 'x']],将其扁平化: 1. 通过 apply ...