SDUT 2772 数据结构实验之串一:KMP简单应用

时间:2022-10-11 16:14:13

数据结构实验之串一:KMP简单应用

Time Limit: 1000MS Memory Limit: 65536KB

Problem Description

给定两个字符串string1和string2,判断string2是否为string1的子串。

Input

 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

Output

 对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

Example Input

abc
a
123456
45
abc
ddd

Example Output

1
4
-1

DQE:

 
KMP算法的经典应用,可自己推算一下或查阅相关资料。
 
 #include <iostream>
 #include <cstdio>

 using namespace std;

 int strlen(char *s)
 {
     ;
     while(s[i]!='\0')
     {
         i++;
     }
     return i;
 }

 void cnext(char *s,int *next)
 {
     int l=strlen(s);
     ,j=-;
     next[i]=j;
     )
     {
         ||s[i]==s[j])
         {
             i++;
             j++;
             next[i]=j;
         }
         else
         {
             j=next[j];
         }
     }
 }

 int kmp(char *s1,char *s2,int *next)
 {
     int l1=strlen(s1),l2=strlen(s2);
     ,j=;
     while(i<l1&&j<l2)
     {
         ||s1[i]==s2[j])
         {
             i++;
             j++;
         }
         else
         {
             j=next[j];
         }
     }
     if(j>=l2)
         ;
     ;
 }

 int main()
 {
     ],s2[];
     ];    //此处用static不完全等同于放到全局变量
     while(gets(s1))
     {
         gets(s2);
         cnext(s2,next);
         printf("%d\n",kmp(s1,s2,next));
     }
     ;
 }

 /***************************************************
 User name: ***
 Result: Accepted
 Take time: 68ms
 Take Memory: 1012KB
 Submit time: 2016-11-02 21:33:59
 ****************************************************/