这一看就是直接套用KMP得板子就行,但是问题就是它需要循环匹配,这就用到了一个技巧,循环可以怎么办呢?我们可以把s串长度变为二倍,比如abc变为abcabc,这样的好处就不用麻烦得去循环,而且一般的题都不会爆。
AC代码:
#include <iostream>
#include <string>
using namespace std;
const int MAX_N = 100010;
int Next[2*MAX_N];
void GetNext(string t)
{
int k = -1, j = 0;
Next[0] = -1;
while (j < t.size()-1)
{
if (k == -1 || t[j] == t[k])
{
k++;
j++;
Next[j] = k;
}
else
{
k = Next[k];
}
}
}
bool KMP(string s, string t)
{
int i=0, j=0;
int sLen = s.size();
int tLen = t.size();
while (i < sLen && j < tLen)
{
if (j == -1 || s[i] == t[j])
{
i++;
j++;
}
else
{
j = Next[j];
}
}
if (j == tLen)
{
return true;
}
else
{
return false;
}
}
int main()
{
ios::sync_with_stdio(false);
string s, t;
while (cin >> s >> t)
{
s+=s;
GetNext(t);
if (KMP(s, t))
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
return 0;
}