hdu2087kmp
Input输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
题意:找两个字符串的最大匹配数
题解:用kmp每次把父串减去前面已经匹配好的,当无匹配时就直接退出
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; int Next[N],slen,plen;
string str,ptr; void getnext()
{
int k=-;
Next[]=-;
for(int i=;i<=slen-;i++)
{
while(k>-&&str[k+]!=str[i])k=Next[k];
if(str[k+]==str[i])k++;
Next[i]=k;
}
}
int kmp()
{
int k=-;
for(int i=;i<=plen-;i++)
{
while(k>-&&str[k+]!=ptr[i])k=Next[k];
if(str[k+]==ptr[i])k++;
if(k==slen-)return i-slen+;
}
return -;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
// cout<<setiosflags(ios::fixed)<<setprecision(2);
while(){
cin>>ptr;
if(ptr=="#")break;
cin>>str;
slen=str.size();
plen=ptr.size();
getnext();
int res=;
while(plen>=slen){
int ans=kmp()+;
if(ans==)break;
res++;
ptr=ptr.substr(ans+slen-,plen);
plen=ptr.size();
}
cout<<res<<endl;
}
return ;
}
第二个方法感觉更好,直接用kmp的特点直接跳到下一个匹配串
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; int Next[N],slen,plen,res;
string str,ptr; void getnext()
{
int k=-;
Next[]=-;
for(int i=;i<=slen-;i++)
{
while(k>-&&str[k+]!=str[i])k=Next[k];
if(str[k+]==str[i])k++;
Next[i]=k;
}
}
void kmp()
{
int k=-;
for(int i=;i<=plen-;i++)
{
while(k>-&&str[k+]!=ptr[i])k=Next[k];
if(str[k+]==ptr[i])k++;
if(k==slen-)
{
k=-;
res++;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
// cout<<setiosflags(ios::fixed)<<setprecision(2);
while(){
cin>>ptr;
if(ptr=="#")break;
cin>>str;
slen=str.size();
plen=ptr.size();
getnext();
res=;
kmp();
cout<<res<<endl;
}
return ;
}
hdu2087kmp的更多相关文章
- hdu2087kmp模板练习
题目网址:http://icpc.njust.edu.cn/Problem/Hdu/2087/ 代码: #include<bits/stdc++.h> using namespace st ...
随机推荐
- linux基础命令---tmpwatch
tmpwatch 删除最近一段时间没有访问的文件,时间以小时为单位,节省磁盘空间.tmpwatch递归删除给定时间未被访问的文件.通常,它用于清理用于临时保存空间(如/tmp)的目录.当更改目录时,t ...
- nodepad++ 标签栏无法拖放标签
nodepad++ 标签栏无法拖放标签设置--首选项--常用--标签栏--锁定(不允许拖放) 去掉这个勾 ps:最近版本的不知道为什么这个设置不生效了,没找到原因,可能是bug,只能等待升级解决了(升 ...
- SVN版本服务器搭建
windows: https://blog.csdn.net/lu1024188315/article/details/74082227 SVN 的下载地址如下 http://torto ...
- 我用了7年时间成长为阿里Java架构师,你呢?(附学习路线图)
前言:我用了七年的时间,一步一步走到了现在,中途也有了解过其他的技术,也想过要转其他的语言,但是最后还是坚持下来走Java这条路,希望我的经历可以帮助到后来的人,要是觉得对你有帮助的话,可以点赞关 ...
- Android 拖动条 和 Handle
- js常量
原文链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/const const 声明创建一个 ...
- 20145225《网络对抗》Exp6 信息搜集与漏洞扫描
基础问题回答 哪些组织负责DNS,IP的管理: 全球根服务器均由美国政府授权的ICANN统一管理,负责DNS和IP地址管理.全球一共有5个地区性注册机构:ARIN(北美地区业务),RIPE(负责欧洲地 ...
- Linux-进程间的通信-信号集函数【转】
我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...
- Win7系统中如何查看当前文件被哪一个程序占用了
https://superuser.com/questions/117902/find-out-which-process-is-locking-a-file-or-folder-in-windows ...
- 创建标签等操作DOM的原生js API
()创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 ...