首页 > 代码库 > HDU - 1711 Number Sequence
HDU - 1711 Number Sequence
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
InputThe first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
OutputFor each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
Sample Input
2 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 1 3 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 2 1
Sample Output
6 -1
将字符换成数字的KMP
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 int s[10005],ss[1000005],Next[10005]; 8 int T,n,m; 9 10 void getnext(int* s) 11 { 12 Next[0]=0; 13 Next[1]=0; 14 for(int i=1;i<m;i++) 15 { 16 int j=Next[i]; 17 while(j&&s[i]!=s[j]) 18 j=Next[j]; 19 if(s[i]==s[j]) 20 Next[i+1]=j+1; 21 else 22 Next[i+1]=0; 23 } 24 } 25 26 int main() 27 { 28 scanf("%d",&T); 29 while(T--) 30 { 31 int flag=0; 32 memset(Next,0,sizeof(Next)); 33 memset(ss,0,sizeof(ss)); 34 memset(s,0,sizeof(s)); 35 scanf("%d%d",&n,&m); 36 for(int i=0;i<n;i++) 37 scanf("%d",&ss[i]); 38 for(int i=0;i<m;i++) 39 scanf("%d",&s[i]); 40 getnext(s); 41 int j=0; 42 for(int i=0;i<n;i++) 43 { 44 while(j&&s[j]!=ss[i]) 45 j=Next[j]; 46 if(ss[i]==s[j]) 47 j++; 48 if(j==m) 49 { 50 flag=1; 51 printf("%d\n",i-m+2); 52 } 53 54 } 55 if(flag==0) 56 printf("-1\n"); 57 } 58 59 60 return 0; 61 }
HDU - 1711 Number Sequence