国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

數(shù)據(jù)結(jié)構(gòu)實驗之串三:KMP應(yīng)用

2019-11-14 10:47:23
字體:
供稿:網(wǎng)友

think: 1、下午一直在做這個題,因為自己對KMP算法并不理解,自己錯了一遍又一遍,感覺自己的心態(tài)以及迎難而上的決心并不堅決,希望自己能夠盡快克服自己的情緒戰(zhàn)勝自己對一些因素的懦弱。最后自己想寫一組數(shù)據(jù),自己認(rèn)為后臺判定應(yīng)該加入這類數(shù)據(jù),希望大家在下方討論區(qū)留下自己對這組數(shù)據(jù)的見解,謝謝。 example input: 6 1 2 3 3 3 3 3 3 3 3 example output: -1

2、審題需要反思(忽略題意中唯一的確定的這一重要信息,導(dǎo)致反復(fù)錯誤)。 3、樣本數(shù)據(jù)能力需要提高

sdut原題鏈接

數(shù)據(jù)結(jié)構(gòu)實驗之串三:KMP應(yīng)用 Time Limit: 1000MS Memory Limit: 65536KB

PRoblem Description 有n個小朋友,每個小朋友手里有一些糖塊,現(xiàn)在這些小朋友排成一排,編號是由1到n?,F(xiàn)在給出m個數(shù),能不能唯一的確定一對值l和r(l <= r),使得這m個數(shù)剛好是第l個小朋友到第r個小朋友手里的糖塊數(shù)?

Input 首先輸入一個整數(shù)n,代表有n個小朋友。下一行輸入n個數(shù),分別代表每個小朋友手里糖的數(shù)量。 之后再輸入一個整數(shù)m,代表下面有m個數(shù)。下一行輸入這m個數(shù)。

Output 如果能唯一的確定一對l,r的值,那么輸出這兩個值,否則輸出-1

Example Input 5 1 2 3 4 5 3 2 3 4

Example Output 2 4

Hint Author windream

以下為accepted代碼—建議參考

#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXN 1998414int next[MAXN], n, m;int s[MAXN], p[MAXN];void get_next(int p[]){ int i = 0, j = -1; next[0] = -1; while(i < m-1) { if(j == -1 || p[i] == p[j]) { i++; j++; next[i] = j; } else j = next[j]; }}int kmp(int s[], int p[], int x){ if(m == 0 || n == 0) return -1; int i = x, j = 0; memset(next, 0, sizeof(next)); get_next(p); while(i < n && j < m) { if(j == -1 || s[i] == p[j]) { i++; j++; } else j = next[j]; } if(j == m) return i-m+1; else return -1;}int main(){ int i, y1, y2; while(scanf("%d", &n) != EOF) { for(i = 0; i < n; i++) { scanf("%d", &s[i]); } scanf("%d", &m); for(i = 0; i < m; i++) { scanf("%d", &p[i]); } y1 = kmp(s, p, 0); if(y1 != -1) { y2 = kmp(s, p, y1); if(y2 == -1) printf("%d %d/n", y1, y1+m-1); else printf("-1/n"); } else printf("-1/n"); } return 0;}/***************************************************User name: jk160630Result: AcceptedTake time: 152msTake Memory: 6284KBSubmit time: 2017-02-04 16:02:35****************************************************/

以下為accepted代碼—不符合最上方舉例數(shù)據(jù)

#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXN 1998414int next[MAXN], n, m;int s[MAXN], p[MAXN];void get_next(int p[]){ int i = 0, j = -1; next[0] = -1; while(i < m-1) { if(j == -1 || p[i] == p[j]) { i++; j++; next[i] = j; } else j = next[j]; }}int kmp(int s[], int p[], int x){ if(m == 0 || n == 0) return -1; int i = x, j = 0; memset(next, 0, sizeof(next)); get_next(p); while(i < n && j < m) { if(j == -1 || s[i] == p[j]) { i++; j++; } else j = next[j]; } if(j == m) return i-m+1; else return -1;}int main(){ int i, y1, y2; while(scanf("%d", &n) != EOF) { for(i = 0; i < n; i++) { scanf("%d", &s[i]); } scanf("%d", &m); for(i = 0; i < m; i++) { scanf("%d", &p[i]); } y1 = kmp(s, p, 0); if(y1 != -1) { y2 = kmp(s, p, y1+m-1); if(y2 == -1) printf("%d %d/n", y1, y1+m-1); else printf("-1/n"); } else printf("-1/n"); } return 0;}/***************************************************User name: jk160630Result: AcceptedTake time: 160msTake Memory: 6288KBSubmit time: 2017-02-04 15:59:14****************************************************/
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 赣榆县| 江华| 太康县| 上蔡县| 五莲县| 武城县| 徐水县| 南京市| 宜兴市| 三亚市| 临漳县| 夏邑县| 江永县| 德安县| 涿鹿县| 左权县| 嘉善县| 于田县| 新河县| 侯马市| 沽源县| 玉田县| 长子县| 鄂托克前旗| 甘肃省| 禄丰县| 呼玛县| 大连市| 三穗县| 宣化县| 大埔县| 沁源县| 海原县| 房产| 梅州市| 江北区| 昌宁县| 乌拉特前旗| 孟连| 重庆市| 都江堰市|