Similar Word
TimeLimit:
Totalsubmit:
Description
It was a crummy day for Lur. He failed to pass to the CET-6(College English Test Band-6). Looking back on how it was in lastyear gone by, he gradually noticed he had fled too many EnglishLessons. But he determines to memorize words on his bed ,not in theclassroom. You know, it is not that easy to pass the test mainlybecause the large amount of born words.always choose to select a word to learn from the similar words .For him, two words are similar if and only if one word can equal tothe other by multiple cyclic shift(at least 1). For example, "car"and "arc" are similar words, while "car" and "rca" are also similarwords . To save more time to playgames,
Lur want to know wether two words are similar words faster, he asksyou to write a program to tell him ,can you help him?
Input
There are multiple test cases. Each case contains two lines. Eachline contains a word,W. You can assume that length(W)<= 10^5
Output
Output “yes” in a single line if two words are similar,otherwiseyou should outputSample Input
car
arc
car
cra
car
car
Sample Output
yes
no
no
#include<string.h>
#include <string>
#include<algorithm>
#include<iostream>
#include <math.h>
#include <stdio.h>
#define MAX 100001
using namespace std;
char w[MAX*2],cw[MAX];
void getNext(char *p,int *next){
int j,k,len=strlen(p);
next[0]=-1;
j=0;
k=-1;
while(j<len-1){
if(k==-1||p[j]==p[k]) {
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp(char *s,char *p){
int next[MAX];
int i,j,len=strlen(s);
i=1;
j=0;
getNext(p,next);
int len_p = strlen(p);
while(i<2*len-1){
if(j==-1||s[i%len]==p[j]){
i++;
j++;
}
else{
j=next[j];
}
if(j==len_p)
return 1;
}
return 0;
}
int main(){
int len;
while(~scanf("%s%s",w,cw)){
len=strlen(w);
if(len!=strlen(cw))
printf("no\n");
else{
if(kmp(w,cw))
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}