#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 100000+5 int nex[N]; int lenp,lens; string s,p; void getnext() { nex[0]=-1; int k=-1,j=0; while(j<lenp-1) { if(k==-1||p[j]==p[k]) nex[++j]=++k; else k=nex[k]; } } void kmp() { int j=0; int i=0; while(i<lens&&j<lenp) { if(s[i]==p[j]||j==-1) { i++; j++; } else j=nex[j]; if(j==lenp) { printf("yes\n");return ; } } printf("no\n"); return ; } int main() { while(cin>>s>>p) { s=s+s; lens=s.size(); lenp=p.size(); getnext(); kmp(); } return 0; }
原文:https://www.cnblogs.com/bxd123/p/10673018.html