Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 706 Accepted Submission(s): 266

Problem Description

Mr. Frog has two sequences a1,a2,⋯,an and b1,b2,⋯,bm and a number p. He wants to know the number of positions q such that sequence b1,b2,⋯,bm is exactly the sequence aq,aq+p,aq+2p,⋯,aq+(m−1)p where q+(m−1)p≤n and q≥1.

Input

The first line contains only one integer T≤100, which indicates the number of test cases.

Each test case contains three lines.

The first line contains three space-separated integers 1≤n≤106,1≤m≤106 and 1≤p≤106.

The second line contains n integers a1,a2,⋯,an(1≤ai≤109).

the third line contains m integers b1,b2,⋯,bm(1≤bi≤109).

Output

For each test case, output one line “Case #x: y”, where x is the case number (starting from 1) and y is the number of valid q’s.

Sample Input

2

6 3 1

1 2 3 1 2 3

1 2 3

6 3 2

1 3 2 2 3 1

1 2 3

Sample Output

Case #1: 2

Case #2: 1

Source

2016中国大学生程序设计竞赛(长春)-重现赛

【题解】



意思是让你在

a1,a1+p,a1+2p,a1+3p…

a2,a2+p,a2+2p,a2 + 3p..

a3,a3+p,a3+2p,a3 +3p



ap,ap+p,ap+2p,ap+3p..

(a右边的东西都是下标;)

这p个序列里面找b数组的匹配数目;

用vector类处理出这个p个数列就好。

剩下的用KMP算法解决。

找完一个匹配之后,j==m。

这个时候让j= f[j];

就能继续找匹配了。

记住就好。不然每次都想好烦。

#include <cstdio>
#include <iostream>
#include <vector> const int MAXN = 2e6;
const int MAXM = 2e6; using namespace std; int p;
vector <int> a[MAXN];
int b[MAXM];
int f[MAXM],ans,n,m; void input(int &r)
{
int t = getchar();
while (!isdigit(t)) t = getchar();
r = 0;
while (isdigit(t)) r = r * 10+t-'0', t = getchar();
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
int t;
input(t);
for (int q = 1; q <= t; q++)
{
for (int i = 0; i <= 1000000; i++)//a[0]也要clear!
a[i].clear();
ans = 0;
input(n); input(m); input(p);
for (int i = 1; i <= n; i++)
{
int x;
input(x);
a[(i%p)].push_back(x);
}
for (int j = 0; j <= m - 1; j++)
input(b[j]);
f[0] = 0; f[1] = 0;
for (int i = 1; i <= m - 1; i++)//获取失配函数,b数组下表是从0开始的。
{
int j = f[i];
while (j && b[j] != b[i]) j = f[j];
f[i + 1] = b[j] == b[i] ? j + 1 : 0;
}
for (int i = 0; i <= p - 1; i++)//给p个数列找匹配数目
{
int j = 0, len = a[i].size();
for (int k = 0; k <= len - 1; k++)
{
while (j && a[i][k] != b[j]) j = f[j];
if (a[i][k] == b[j])
j++;
if (j == m)
{
ans++;
j = f[j];
}
}
}
printf("Case #%d: %d\n", q, ans);
}
return 0;
}

最新文章

  1. java中的锁
  2. [原创]Centos7 从零整合LNMP一体包
  3. codeforces 616E Sum of Remainders (数论,找规律)
  4. Vmware怎样使用nat和桥接方式解决虚拟机联网问题
  5. Codeforces Round #230 (Div. 2) 解题报告
  6. Spring框架:Spring容器具体解释
  7. uva 11440 - Help Tomisu(欧拉功能)
  8. 设计模式-前摄器模式(Proactor)
  9. Java基础try-with-resource语法源码分析
  10. MySQL数据库一般设计规则
  11. 聊一聊Java泛型的擦除
  12. linux网关设置
  13. SpringMVC学习笔记_02
  14. IP报文
  15. gdb 调试(设置变量)(六)
  16. dockerfile基础命令
  17. 在cygwin下安装ns2
  18. EDT改成CST
  19. rabbitmqctl 的常用命令
  20. oracle连接池问题

热门文章

  1. Java判断1个字符串中出现了几次其他字符串
  2. 编程——C语言的问题,比特率
  3. Javascript和jquery事件--鼠标右键事件,contextmenu
  4. Django中pycharm中 报错 ---ValueError: The field admin.LogEntry.user was declared with a lazy reference to &#39;system.sysuser&#39;, bu
  5. APP测试10点
  6. Mosquito的优化——订阅树优化(八)
  7. 内存问题检查利器——Purify
  8. 10.8 android输入系统_实战_使用GlobalKey一键启动程序
  9. ITFriend开发日志20140611
  10. u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统