CODEVS 1204 寻找子串位置 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODEVS 1204 寻找子串位置 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:http://codevs.cn/problem/1204/
题目描述 Description
给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置。
输入描述 Input Description
仅一行包含两个字符串a和b
输出描述 Output Description
仅一行一个整数
样例输入 Sample Input
abcd bc
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
字符串的长度均不超过100
Pascal用户请注意:两个字符串之间可能包含多个空格
分析:
KMP算法裸题。至于KMP算法的讲解...
虽然朋友的KMP跟我并不一样(什么),反正KMP算法只要理解了原理背板子就好啦
AC代码:
1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 7 char a[1005],s[1005]; 8 int nxt[1005],len1,len2; 9 10 void calc_nxt() 11 { 12 int k = -1,j = 0; 13 nxt[0] = -1; 14 while(j < len2) 15 { 16 if(k == -1 || s[j] == s[k]) 17 { 18 ++ k,++ j; 19 if(s[k] != s[j]) 20 nxt[j] = k; 21 else 22 nxt[j] = nxt[k]; 23 } 24 else 25 k = nxt[k]; 26 } 27 } 28 29 inline int KMP(int k) 30 { 31 int j = 0; 32 while(j < len1 && j < len2) 33 { 34 if(j == -1 || a[k] == s[j]) 35 ++ k,++ j; 36 else 37 j = nxt[j]; 38 } 39 if(j == len2) return k-j; 40 return -1; 41 } 42 43 int main() 44 { 45 scanf("%s",a); 46 scanf("%s",s); 47 len1 = strlen(a),len2 = strlen(s); 48 calc_nxt(); 49 printf("%d\\n",KMP(0)+1); 50 return 0; 51 }
以上是关于CODEVS 1204 寻找子串位置 题解的主要内容,如果未能解决你的问题,请参考以下文章