#include<iostream>#include<string>#define MAX_CHAR 256//用字符对应的ascii码作为数组下标#define MAX_LENGTH 1000usingnamespace std;voidGetNext(string & p,int& m,int next[]){for(int i =0; i < MAX_CHAR; i++)
next[i]=-1;//初始化为-1,如果倒着没找到相应的字符则证明这m个字符//可以直接跳过 for(int i =0; i < m; i++)
next[p[i]]= i;//将每一个字符对应的next数组值变为该字符在字符串中最后一次出现的位置}voidSunday(string & s,int& n, string & p,int& m){int next[MAX_CHAR];GetNext(p, m, next);int j;// s 的下标int k;// p 的下标int i =0;while(i <= n - m){
j = i;
k =0;while(j < n && k < m && s[j]== p[k])
j++, k++;if(k == m)
cout <<"在"<< i <<" 处找到匹配\n";if(i + m < n)
i +=(m - next[s[i + m]]);//next[s[i + m]即模式串对应主串再往后一个字符,寻找这个字符在模式串中的位置elsereturn;}}intmain(){
string s, p;int n, m;while(cin >> s >> p){
n = s.size();
m = p.size();Sunday(s, n, p, m);
cout << endl;}return0;}