HDU2203 亲和串

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

 
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
 
 
 
正解:KMP
解题报告:
  KMP裸题,只需要把母串再复制一遍,然后跑KMP就可以了。
  联赛前复习模板...
 
 //It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <stack>
using namespace std;
typedef long long LL;
const int MAXN = ;
char s[MAXN],ch[MAXN];
int f[MAXN],n,m; inline int getint(){
int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
} inline void build(){
n=strlen(s); m=strlen(ch); int j; f[]=f[]=;
for(int i=n;i<n+n;i++) s[i]=s[i-n]; n*=;
for(int i=;i<m;i++) {
j=f[i]; while(j && ch[j]!=ch[i]) j=f[j];
f[i+]= (ch[j]==ch[i])?j+:;
}
} inline bool find(){
int j=; if(n/<m) return false;
for(int i=;i<n;i++) {
while(j && s[i]!=ch[j]) j=f[j];
if(s[i]==ch[j]) j++;
if(j==m) return true;
}
return false;
} inline void work(){
while(scanf("%s",s)!=EOF) {
scanf("%s",ch); build();
if(find()) printf("yes\n");
else printf("no\n");
}
} int main()
{
work();
return ;
}
上一篇:hdu2544 最短路 Dijkstra算法


下一篇:20190422 T-SQL 触发器