necklace
# 题意
输入两个字符串,定义两个字符串相等当两个字符串从某一个位置开始顺时针绕一圈后相等就是相同的项链
# 题解
即求出两个字符串的最小表示,最小表示相同则是相同的字符串
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10; 4 char a[N*2],b[N*2]; 5 int min_string(char *str){ 6 int len=strlen(str+1); 7 for(int i=1;i<=len;i++) 8 str[len+i]=str[i]; 9 int i=1,j=2,k; 10 while(i<=len && j<=len){ 11 for(k=0;k<len && str[i+k] == str[j+k];k++); 12 if(k==len) break; 13 if(str[i+k]>str[j+k]){ 14 i=i+k+1; 15 if(i==j) i++; 16 } 17 else{ 18 j=j+k+1; 19 if(i==j) j++; 20 } 21 } 22 return min(i,j); 23 } 24 int main(){ 25 scanf("%s",a+1); 26 int n=strlen(a+1),x=min_string(a); 27 scanf("%s",b+1); 28 int m=strlen(b+1),y=min_string(b); 29 a[x+n]=b[y+m]='\0'; //加一个字符串结尾标志 30 if(n==m && !strcmp(a+x,b+y)){ 31 puts("Yes"); 32 puts(a+x); 33 } 34 else puts("No"); 35 }