日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【37.68%】【hdu 5918】Sequence I

發布時間:2023/11/29 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【37.68%】【hdu 5918】Sequence I 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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; }

轉載于:https://www.cnblogs.com/AWCXV/p/7632169.html

總結

以上是生活随笔為你收集整理的【37.68%】【hdu 5918】Sequence I的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。