码迷,mamicode.com
首页 > 其他好文 > 详细

CODEVS 1204 寻找子串位置 题解

时间:2017-10-09 22:28:24      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:pre   problem   用户   logs   裸题   整数   html   理解   strong   

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接: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 寻找子串位置 题解

标签:pre   problem   用户   logs   裸题   整数   html   理解   strong   

原文地址:http://www.cnblogs.com/shingen/p/7642853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!