博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP - HDU 1711 Number Sequence
阅读量:7021 次
发布时间:2019-06-28

本文共 1967 字,大约阅读时间需要 6 分钟。

Number Sequence

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 11606    Accepted Submission(s): 5294

Problem Description
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
 
Input
The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
 
Output
For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
 
Sample Input
2
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 2 1
 
Sample Output
6
-1 

 

Mean: 

 给你s1,s2两个串,让你找到s2在s1中出现的第一个位置。

analyse:

 KMP字符串水题.

Time complexity:O(n+m)

 

Source code:

#include<cstdio>
#include<cstring>
int
l1
,
l2;
int
a
[
1000010
],b
[
10010
],
Next
[
10010
];
void
getNext()
{
     
Next
[
0
]
=
0;
     
int
i
,
k;
     
for(
i
=
1
,
k
=
0;
i
<
l2;
++
i)
     
{
           
while(b
[
i
]
!=b
[
k
]
&&
k
>
0)
                 
k
=
Next
[
k
-
1
];
           
if(b
[
i
]
==b
[
k
])
++
k;
           
Next
[
i
]
=
k;
     
}
}
int
kmp()
{
     
getNext();
     
for(
int
i
=
0
,
k
=
0;
i
<
l1;
++
i)
     
{
           
while(
a
[
i
]
!=b
[
k
]
&&
k
>
0)
                 
k
=
Next
[
k
-
1
];
           
if(
a
[
i
]
==b
[
k
])
++
k;
           
if(
k
==
l2)
return
i
-
l2
+
2;
     
}
     
return
-
1;
}
int
main()
{
     
int
t;
     
scanf(
"%d"
,
&
t);
     
while(
t
--)
     
{
           
scanf(
"%d %d"
,
&
l1
,
&
l2);
           
for(
int
i
=
0;
i
<
l1;
++
i)
scanf(
"%d"
,
&
a
[
i
]);
           
for(
int
i
=
0;
i
<
l2;
++
i)
scanf(
"%d"
,
&b
[
i
]);
           
printf(
"%d
\n
"
,
kmp());
     
}
     
return
0;
}

 

转载于:https://www.cnblogs.com/crazyacking/p/3998350.html

你可能感兴趣的文章
python getchar_python中的getchar返回permission denied(android 8.0)
查看>>
传染病模型python_传染病动力学模型 SI => SIS => SIR => SEIR(python)
查看>>
html天气预报代码_接口测试平台代码实现114:登录态接口10
查看>>
删除mysql数据库后遗留_mysql数据库被删除后怎么恢复
查看>>
mysql一对多怎么聚合多_mysql多对多
查看>>
mysql 并发控制_mysql并发控制
查看>>
mysql处理高并发的架构_mysql高可用架构设计,处理高并发,大流量!
查看>>
pdo_mysql断线重连_Yii2实现Mysql断线重连
查看>>
mysql 创建视图的好处_mysql视图的作用和优点,视图可以更改么?
查看>>
mysql uuid 和int_MySQL之-uuid做主键与int做主键的性能实测对比详解
查看>>
实验三lr1分析法java_Java中9种常见的CMS GC问题分析与解决(四)
查看>>
hive数据库存入mysql_hive 数据库操作
查看>>
mysql 取30行_sql分页取30-40条记录
查看>>
java递归mysql生成树_java递归生成树结构的数据
查看>>
kettle获取当前日期_kettle获取系统时间
查看>>
spark写mysql优化简书_Spark SQL:性能优化
查看>>
mysql gtid 主主_MySQL优化之七--Mysql基于GTID的主从复制
查看>>
python字节码文件后缀_Python反编译之字节码
查看>>
gdb加载python_gdb加载python脚本的方法
查看>>
let 指定长度的数组_怎样在JavaScript中创建和填充任意长度的数组 [每日前端夜话0x29]...
查看>>