可以让s1、s2互相进行KMP,看后缀匹配的长度是否>= len2即可。
再特殊处理一下len1 < len2的情况。
举个例子:
AABCD
CDAA
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <ctype.h>
#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <assert.h>
#include <time.h>
#include <sstream>
typedef long long LL;
const int INF = 500000001;
const double EPS = 1e-9;
const double PI = acos(-1.0);
using namespace std;
int next1[100005], next2[100005];
char ch1[100005], ch2[100005];
void getnext(char *ch, int *next, int len)
{
next[1] = 0;
int s = 2, t = 0;
while(s <= len)
{
if(t == 0 || ch[s - 1] == ch[t])
{
t++;
next[s++] = t;
}
else
{
t = next[t];
}
}
}
int kmp(char *c1, char *c2, int *next, int len, int tlen)
{
int s = 1, t = 1;
while(s <= len)
{
if(t == 0 || c1[s] == c2[t])
{
++s;
++t;
if(t == tlen+1)
{
return t;
}
}
else
{
t = next[t];
}
}
return t;
}
int main()
{
#ifdef _Te3st
freopen("test0.in", "r", stdin);
freopen("test0.out", "w", stdout);
srand(time(NULL));
#endif
while(~scanf("%s %s", ch1 + 1, ch2 + 1))
{
int len1 = strlen(ch1 + 1);
int len2 = strlen(ch2 + 1);
getnext(ch1, next1, len1);
getnext(ch2, next2, len2);
int t1 = kmp(ch1, ch2, next2, len1, len2) - 1;
int t2 = kmp(ch2, ch1, next1, len2, len1) - 1;
if(t1 + t2 >= len2 && len1 >= len2)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}