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 ...
随机推荐
- ETH Dapp 体验报告
Dapp 体验报告 Dapp是分散式的应用程序.DApp运行在去中心化的网络上,也就是区块链网络中.网络中不存在中心化的节点可以完整的控制DApp. 必须依赖合约部署,没有一个中心化的服务器托管. 对 ...
- Metinfo 5.3.19管理员密码重置漏洞复现
Metinfo 5.3.19管理员密码重置漏洞 操作系统:Windows 10专业版 kali linux 网站环境:UPUPW 5.3 使用工具:burpsuite 1.7 beta 漏洞分 ...
- socks5代理原理解析
sock5代理的工作程序是: 1.需要代理方向服务器发出请求信息. 2.代理方应答 3.需要代理方接到应答后发送向代理方发送目的ip和端口 4.代理方与 ...
- 【整理】 vue-cli 打包后显示favicon.ico小图标
vue-cli 打包后显示favicon.ico小图标 https://www.cnblogs.com/mmzuo-798/p/9285013.html
- QT+ 使用标准对话框+关于对话框+问题对话框+文件对话框
#include "mainwindow.h" #include <QMenuBar> #include <QMenu> #include <QAct ...
- QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息
Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...
- jquery 定位
jquery 定位 <html> <head> <title>jquery 定位</title> </head> <body> ...
- shell $() vs ${}
reference $( )与` `(反引号)都是用来做命令替换(command substitution)用的 run command 3, 2, 1 command1 $(command2 $(c ...
- ES搭建
https://www.cnblogs.com/jstarseven/p/6803054.html
- Centos 7 编译nginx 1.14.0
步骤一:下载nginx安装包 wget https://nginx.org/download/nginx-1.14.0.tar.gz 步骤二:安装nginx依赖包 yum install -y gcc ...