标签:ber pre pac std sed splay enc gif main
题意:
反正就是给出一个T,然后每个T:一个n,一个m,表示主串的数字数量和模式串的数字数量,求第一个匹配的位置。
思路:
KMP模板套套就好啦。
参考代码:
1 #include <iostream> 2 #include <vector> 3 #include <map> 4 #include <string> 5 #include <queue> 6 #include <stack> 7 #include <set> 8 #include <algorithm> 9 10 #include <cstdio> 11 #include <cstring> 12 #include <cmath> 13 #include <cstdlib> 14 using namespace std; 15 16 const int INF=0x3f3f3f3f; 17 const int SIZE=10000; 18 typedef long long LL; 19 20 int nextt[10005]; 21 int a[1000005]; 22 int b[10005]; 23 int n,m; 24 void findnext() 25 { 26 memset(nextt,0,sizeof(nextt)); 27 int len=m; 28 nextt[0]=-1; 29 int k=-1,j=0; 30 while(j<len) 31 { 32 if(k==-1||b[k]==b[j]) 33 { 34 k++; 35 j++; 36 if(b[j]!=b[k]) 37 nextt[j]=k; 38 else 39 nextt[j]=nextt[k]; 40 } 41 else 42 { 43 k=nextt[k]; 44 } 45 } 46 } 47 48 int kmp() 49 { 50 int i=0,j=0; 51 int sa=n,sb=m; 52 while(i<sa&&j<sb) 53 { 54 if(j==-1||a[i]==b[j]) 55 { 56 i++; 57 j++; 58 } 59 else 60 { 61 j=nextt[j]; 62 } 63 } 64 if(j==sb) 65 return i-j+1; 66 else 67 return -1; 68 } 69 int main() 70 { 71 int t; 72 scanf("%d",&t); 73 while(t--) 74 { 75 scanf("%d%d",&n,&m); 76 for(int i=0;i<n;i++) 77 { 78 scanf("%d",&a[i]); 79 } 80 for(int j=0;j<m;j++) 81 scanf("%d",&b[j]); 82 findnext(); 83 int res=kmp(); 84 printf("%d\n",res); 85 86 } 87 return 0; 88 }
标签:ber pre pac std sed splay enc gif main
原文地址:http://www.cnblogs.com/xxQ-1999/p/7522461.html