您的位置:首页 > 其它

Codeforces Round #269 (Div. 2) D(KMP)

2018-01-30 22:32 134 查看
题目链接:http://codeforces.com/group/1EzrFFyOc0/contest/471/problem/D
题目思路:这题主要就是两张图的匹配吧(可重叠),因为墙上下可以移动,其实就是匹配轮廓了,完全可以用KMP,KMP第一题纪念一下,果然还是菜啊。
至于KMP感觉这篇博文不错:http://blog.csdn.net/starstar1992/article/details/54913261
AC代码:#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include<iomanip>
using namespace std;
typedef long long ll;
#define inf int(0x3f3f3f3f)
#define mod int(1e9+7)
#define pi acos(-1)
inline int read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
int c[200008],d[200008],ne[200008];
void cal(int w)
{
ne[0]=-1;
int k=-1,i=0;
while(i<w)
{
while(k>-1&&d[k]!=d[i])
{
k=ne[k];
}
if(d[k]==d[i]||k==-1)
{
k++;
}
ne[++i]=k;
}
return;
}
int kmp(int n,int w)
{
int k=-1,s=0;
for(int i=0;i<n;i++)
{
while(k>-1&&d[k+1]!=c[i])
{
k=ne[k];
}
if(d[k+1]==c[i])
{
k++;
}
if(k==w-1)
{
s++;
k=ne[k];
}
}
return s;
}
int main()
{
int n,w;
while(cin>>n>>w)
{
memset(ne,0,sizeof(ne));
for(int i=0;i<n;i++)
{
c[i]=read();
}
for(int i=0;i<n-1;i++)
{
c[i]=c[i+1]-c[i];
}
for(int i=0;i<w;i++)
{
d[i]=read();
}
for(int i=0;i<w-1;i++)
{
d[i]=d[i+1]-d[i];
}
cal(w-1);
int s=0;
s=kmp(n-1,w-1);
if(w==1)
{
s=n;
}
cout<<s<<endl;
}
return 0;
} 还有HDU2087:http://acm.hdu.edu.cn/showproblem.php?pid=2087(这个是不能重叠的,其实差不多QAQ)#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include<iomanip>
using namespace std;
typedef long long ll;
#define inf int(0x3f3f3f3f)
#define mod int(1e9+7)
#define pi acos(-1)
inline int read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
int ne[1008];
string c,d;
void cal(int w)
{
ne[0]=-1;
int k=-1,i=0;
while(i<w)
{
while(k>-1&&d[k]!=d[i])
{
k=ne[k];
}
if(d[k]==d[i]||k==-1)
{
k++;
}
ne[++i]=k;
}
return;
}
int kmp(int n,int w)
{
int k=-1,s=0;
for(int i=0;i<n;i++)
{
while(k>-1&&d[k+1]!=c[i])
{
k=ne[k];
}
if(d[k+1]==c[i])
{
k++;
}
if(k==w-1)
{
s++;
k=-1;
}
}
return s;
}
int main()
{
while(cin>>c)
{
int n,w;
if(c=="#")
{
break;
}
cin>>d;
n=c.size();w=d.size();
memset(ne,0,sizeof(ne));
cal(w);
int s;
s=kmp(n,w);
cout<<s<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: