HDU-1711-Number Sequence
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711
KMP
#include<iostream> #include<string> using namespace std; const int Max_n=1000010; const int Max_m=10010; int a[Max_n]; int b[Max_m]; int n, m; //void get_nextval(const char *T, int next[]) //字符数组用这个 void get_nextval(const int *T, int next[]) { // 求模式串T的next函数值(第二种表示方法)并存入数组 next。 int j = 1, k = 0; next[0] = 0; //while ( T[j] != '\0' )//字符数组用这个 while(j<m) { if(T[j] == T[k]) { next[j] = k; ++j; ++k; } else if(T[j] != T[0]) { next[j] = k; ++j; k=0; } else { next[j] = k; ++j; k=1; } }//while /*for(int i=0;i<j;i++) { cout<<next[i]; } cout<<endl; */ }// myget_nextval //void getNext(const char* pattern,int next[]) //字符数组的用这个 void getNext(const int* pattern,int next[]) { next[0]= -1; int k=-1,j=0; //while(pattern[j] != '\0') //字符数组的用这个 while(j<m) //int数组的用这个 { if(k!= -1 && pattern[k]!= pattern[j] ) k=next[k]; ++j;++k; if(pattern[k]== pattern[j]) next[j]=next[k]; else next[j]=k; } /*////这里是我加的显示部分 for(int i=0;i<j;i++) { cout<<next[i]; } cout<<endl; */ } int Index_BF(int S[], int T[], int pos) { /* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符 起存在和串 T 相同的子串,则称匹配成功,返回第一个 这样的子串在串 S 中的下标,否则返回 -1 */ int i=pos, j=0; while(i<n && j<m) { if(S[i+j]==T[j]) j++;//继续比较后一个字符 else {//重新开始新的一轮匹配 i++; j=0; } } if(j==m) return i;//匹配成功,返回下标 else return -1;// 串S中(第pos个字符起)不存在和串T相同的子串 }//Index_BF //int KMP(const char* Text, const char* Pattern) //字符数组的用这个 int KMP(const int *Text, const int *Pattern) { /*if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' )// return -1;//空指针或空串,返回-1。 int len=0; const char * c=Pattern; while(*c++!='\0')//移动指针比移动下标快。 { ++len;//字符串长度。 } */ int *next=new int[m+1]; getNext(Pattern, next); int index=0, i=0, j=0; //while(Text[i]!='\0' && Pattern[j]!='\0') while(i<n && j<m) { if(Text[i]==Pattern[j]) { i++; j++; } else { index+=j-next[j]; if(next[j]!=-1) j=next[j]; else { j=0; i++; } } } delete[]next; if(j==m) return index; else return -1; } int main() { int next[100]; //getNext(cc, next); //cout<<endl; //myget_nextval(cc,next); int t; int k; cin>>t; while(t--) { int i; cin>>n>>m; for(i=0; i<n; i++) scanf("%d", &a[i]); for(i=0; i<m; i++) scanf("%d", &b[i]); //k=Index_BF(a, b, 0); k=KMP(a, b); if(k!=-1) cout<<k+1<<endl; else cout<<-1<<endl; } return 0; }