EOJ2788

题意:给定数组a,b。

求数组b在a中第一次出现的位置。

KMP

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 const int maxn = 20001;

 4 int a[ maxn ],b[ maxn ];

 5 int n,m;

 6 

 7 int next[ maxn ];

 8 void get_next(){

 9     int j,k;

10     next[ 0 ]=-1;

11     j=0,k=-1;//b[j]为目标串 b[k]为模式串

12     while( j<m ){

13         if( k==-1||b[ j ]==b[ k ] ){

14             j++,k++;

15             next[ j ]=k;

16         }

17         else k=next[ k ];

18     }

19 }

20 int kmp(){

21     get_next();

22     int j,k;

23     j=k=0;//a[j]为目标串,b[k]为模式串

24     while( j<n && k<m ){

25         if( k==-1||a[ j ]==b[ k ] ){

26             j++,k++;

27         }

28         else k=next[ k ];

29         if( k==m ){

30             return j-m+1;

31         }

32     }

33     return -1;

34 }

35 

36 int main(){

37     int T;

38     scanf("%d",&T);

39     while( T-- ){

40         scanf("%d%d",&n,&m);

41         memset(a,0,sizeof(a));

42         for( int i=0;i<n;i++ ){

43             scanf("%d",&a[ i ]);

44         }

45         for( int i=0;i<m;i++ ){

46             scanf("%d",&b[ i ]);

47         }

48         for( int i=n-1;i>=0;i-- ){

49             a[n]+=a[i];

50             a[n]%=10;

51         }

52         for( int i=n+1;i<maxn;i++ ){

53             for( int j=i-1;j>=(i-1-n+1);j--)

54                 a[i]+=a[j];//a[ i ]=2*a[ i-1 ]-a[ cnt ];

55             a[ i ]%=10;

56         }

57         n=maxn-1;

58         int pos=kmp();//返回b在a中第一次出现的位置

59         if( pos==-1 ) printf("-1\n");

60         else printf("%d\n",pos-1);

61     }

62     return 0;

63 }

 

你可能感兴趣的:(OJ)