最小表示法
最小表示法找到最小表示的首位,从首位开始匹配qwq
/**************************************************************
Problem: 1398
User: syh0313
Language: C++
Result: Accepted
Time:556 ms
Memory:11052 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
using
namespace
std;
const
int
maxn=1000010;
int
a[maxn],b[maxn],n,i,j,k,lca,lcb;
char
aa[maxn],bb[maxn];
int
main()
{
scanf
(
"%s%s"
,aa,bb); n=
strlen
(aa);
for
(i=0;i<n;i++) a[i]=aa[i]-
'0'
,b[i]=bb[i]-
'0'
;
i=0; j=1; k=0;
while
(i<n && j<n && k<n)
{
int
t=a[(i+k)%n]-a[(j+k)%n];
if
(!t) k++;
else
{
if
(t>0) i+=k+1;
else
j+=k+1;
if
(i==j) j++;
k=0;
}
}
lca=min(i,j); i=0; j=1; k=0;
while
(i<n && j<n && k<n)
{
int
t=b[(i+k)%n]-b[(j+k)%n];
if
(!t) k++;
else
{
if
(t>0) i+=k+1;
else
j+=k+1;
if
(i==j) j++;
k=0;
}
}
lcb=min(i,j);
for
(
int
i=0;i<n;i++)
if
(a[(lca+i)%n]!=b[(lcb+i)%n]) {
printf
(
"No"
);
return
0;}
printf
(
"Yes\n"
);
for
(
int
i=0;i<n;i++)
printf
(
"%d"
,a[(lca+i)%n]);
return
0;
}