HUD1711
来源:互联网 发布:好八字 知乎 编辑:程序博客网 时间:2024/05/18 22:46
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 1000000
int next[maxn + 2];
int numa[maxn + 10];
int numb[maxn + 10];
int n,m;
void fan( int numb[])
{
int len = n;
next[1] = 0;
for( int i = 2 ,j = 0;i <= len; i++)
{
while( j > 0 && numb[j+1] != numb[i])
j = next[j];
if( numb[j+1] == numb[i])
j ++;
next[i] = j;
}
}
int kmp(int numa[], int numb[])
{
int len1 = n;
int len2 = m;
fan(numb);
for( int i = 0, j = 1; j<= len1; j++)
{
while( i > 0 && numb[ i + 1] != numa[j])
i = next[i];
if( numb[ i +1] == numa[j])
i++;
if( i == len2)
{
return j-len2+1;
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n, &m);
for( int k = 1; k <= n; k++)
cin>>numa[k];
for( int k = 1; k<= m; k++)
cin>>numb[k];
cout<<kmp(numa,numb)<<endl;
}
}
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 1000000
int next[maxn + 2];
int numa[maxn + 10];
int numb[maxn + 10];
int n,m;
void fan( int numb[])
{
int len = n;
next[1] = 0;
for( int i = 2 ,j = 0;i <= len; i++)
{
while( j > 0 && numb[j+1] != numb[i])
j = next[j];
if( numb[j+1] == numb[i])
j ++;
next[i] = j;
}
}
int kmp(int numa[], int numb[])
{
int len1 = n;
int len2 = m;
fan(numb);
for( int i = 0, j = 1; j<= len1; j++)
{
while( i > 0 && numb[ i + 1] != numa[j])
i = next[i];
if( numb[ i +1] == numa[j])
i++;
if( i == len2)
{
return j-len2+1;
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n, &m);
for( int k = 1; k <= n; k++)
cin>>numa[k];
for( int k = 1; k<= m; k++)
cin>>numb[k];
cout<<kmp(numa,numb)<<endl;
}
}
0 0
- HUD1711
- 【剑指offer】二进制中1的个数
- 每天学习一点string.h
- hdu1018
- Android 网络编程 API笔记 - java.net 包相关 接口 api
- 基于C++的串口通讯//使用MsComm控件//SetRThreshold()函数的使用,根据数据数量触发端口
- HUD1711
- JDK1.7.0_51使用javah工具生成.h声明文件的环境配置
- Python中dict的排序方法(按key或按value)
- 跑腿兔(TaskRabbit)是一个跑腿网站
- 使用 LINQ to XML
- poj3177 Redundant Paths
- 导致企业营销模式脱节的几宗问题
- 【Linux入门学习之】vi/vim编辑器必知必会
- PyQt4 精彩实例分析* 实例1 Hello Kitty!