1. 程式人生 > >親和串 kmp

親和串 kmp

科學家 std ane NPU 解決 sam names ott 兩個

  

Problem Description 人隨著歲數的增長是越大越聰明還是越大越笨,這是一個值得全世界科學家思考的問題,同樣的問題Eddy也一直在思考,因為他在很小的時候就知道親和串如何判斷了,但是發現,現在長大了卻不知道怎麽去判斷親和串了,於是他只好又再一次來請教聰明且樂於助人的你來解決這個問題。
親和串的定義是這樣的:給定兩個字符串s1和s2,如果能通過s1循環移位,使s2包含在s1中,那麽我們就說s2 是s1的親和串。

Input 本題有多組測試數據,每組數據的第一行包含輸入字符串s1,第二行包含輸入字符串s2,s1與s2的長度均小於100000。

Output 如果s2是s1的親和串,則輸出"yes",反之,輸出"no"。每組測試的輸出占一行。

Sample Input AABCD CDAA ASD ASDF

Sample Output yes no 模板
#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; }

親和串 kmp