#include <iostream>
#include <string>
using namespace std;
class mystring {
public:
int next[1000];
void buildnext(string ts);
int kmpmatch(string ts, string ms);
void display(string ts);
};
void mystring::buildnext(string ts) {
next[0] = -1;
for (int i = 0, j = -1; ts[i];) {
if (j == -1 || ts[i] == ts[j])
next[++i] = ++j;
else
j = next[j];
}
}
int mystring::kmpmatch(string ts, string ms) {
int tlen = ts.length();
for (int i = 0, j = 0; ms[i];) {
if (j == -1 || ms[i] == ts[j]) {
if (j == tlen - 1) return i - tlen + 2;
else i++, j++;
}
else j = next[j];
}
return 0;
}
void mystring::display(string ts) {
int tlen = ts.length();
for (int i = 0; i < tlen; i++)
cout << next[i] << " ";
cout << endl;
}
int main()
{
int t, position, a, b;
string ts, ms, ss;
// freopen("D:\\out.txt", "w", stdout);
cin >> t;
while (t--) {
cin >> ms >> ts;
mystring mystring1;
mystring1.buildnext(ts);
position = mystring1.kmpmatch(ts, ms);
mystring1.display(ts);
cout << position << endl;
}
// fclose(stdout);
}
KMP算法
最新推荐文章于 2022-12-25 16:41:54 发布