hdu 1686 kmp(求子串出现个数)
2016-07-21 10:44
316 查看
点击打开链接
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =1010000;
char a[M],b[10100];
int Next[M],n,m,lb,la;
void Get()
{
Next[0]=-1;
int i=0,k=-1;
while(i<lb)
{
if(k==-1||b[i]==b[k])
{
Next[i+1]=k+1;
i++;
k++;
}
//自己匹配自己
// next[i]=k "b1...bk-1" == " bi-(k-1) .. bi-1 "
// 当bk回溯到bk'时 -> : "b1..bk'-1" == "bk-(k'-1)...bk-1"
// next[i]=k "bk-(k'-1)...bk-1" == " bi-k'-1 .. bi-1"
//"b1..bk'-1" == " bi-k'-1 .. bi-1" 直到 bk'==bi 即next[i+1]=k'+1
else
{
k=Next[k];
}
}
}
void Kmp()
{
int ans=0;
int i=0,k=0;
while(i<la)
{
if(k==-1||a[i]==b[k])
{
i++;
k++;
if(k==lb)// 匹配成功
{
ans++;
// 本来匹配成功后 最朴素应该 k=0 i=i-lb+1 然后继续比较 -> TLE 太慢
// 如果不回溯主串 应该用模式串第几位于i比较? 因为k=lb b[k]!=a[i] 所以回溯到k=next[k]
k=Next[k];//
}
}
else
{
k=Next[k];
}
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s%s",b,a);
la=strlen(a);
lb=strlen(b);
Get();
Kmp();
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =1010000;
char a[M],b[10100];
int Next[M],n,m,lb,la;
void Get()
{
Next[0]=-1;
int i=0,k=-1;
while(i<lb)
{
if(k==-1||b[i]==b[k])
{
Next[i+1]=k+1;
i++;
k++;
}
//自己匹配自己
// next[i]=k "b1...bk-1" == " bi-(k-1) .. bi-1 "
// 当bk回溯到bk'时 -> : "b1..bk'-1" == "bk-(k'-1)...bk-1"
// next[i]=k "bk-(k'-1)...bk-1" == " bi-k'-1 .. bi-1"
//"b1..bk'-1" == " bi-k'-1 .. bi-1" 直到 bk'==bi 即next[i+1]=k'+1
else
{
k=Next[k];
}
}
}
void Kmp()
{
int ans=0;
int i=0,k=0;
while(i<la)
{
if(k==-1||a[i]==b[k])
{
i++;
k++;
if(k==lb)// 匹配成功
{
ans++;
// 本来匹配成功后 最朴素应该 k=0 i=i-lb+1 然后继续比较 -> TLE 太慢
// 如果不回溯主串 应该用模式串第几位于i比较? 因为k=lb b[k]!=a[i] 所以回溯到k=next[k]
k=Next[k];//
}
}
else
{
k=Next[k];
}
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s%s",b,a);
la=strlen(a);
lb=strlen(b);
Get();
Kmp();
}
return 0;
}
相关文章推荐
- Android实用技术: CoordinatorLayout使用详解
- RocketMQ系列
- Linux之进程终止
- Linux之fork与vfork区别
- Android 依赖
- 全面了解Java中的内部类和匿名类
- HDU 1201 18岁生日
- Python小实验——向类传递参数
- HTTP.Socket.TCP详解
- 设计模式——适配器模式
- 薄荷Toolbar(ActionBar)的适配方案 (翻译)
- webservice简单实例
- Kernel Methods(PRML第六章)读书笔记
- STL中的常用的vector,map,set,Sort用法
- 如何查询Oracle中所有用户信息
- jquery load方法用法详解
- [2016ACM多校] HDU5728 数论 欧拉函数及其定理
- 加速页面显示 压缩html js css
- c++学习笔记(一):环境配置
- subversion to old报错