bzoj1398: Vijos1382寻找主人 Necklace

来源:互联网 发布:软件简介怎么写 编辑:程序博客网 时间:2024/04/29 10:41

最小表示法。
记录两个指针i,j,任何时刻不在相同位置。
当前匹配长度为k.
如果s[i+k]=s[j+k] k++;
如果s[i+k]>s[j+k] i+=k-1,k=0;
s[i+k]

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char s[2][1000010];int n,m;int main(){    scanf("%s%s",s[0],s[1]);    n=strlen(s[0]);    int i=0,j=1,k=0,x,y;    while(i<n&&j<n&&k<n)    {        if(s[0][(i+k)%n]==s[0][(j+k)%n]) k++;        else if(s[0][(i+k)%n]>s[0][(j+k)%n]) i+=k+1,k=0;        else j+=k+1,k=0;        if(i==j)        i++;    }    x=min(i,j);    i=0;j=1;k=0;    while(i<n&&j<n&&k<n)    {        if(s[1][(i+k)%n]==s[1][(j+k)%n]) k++;        else if(s[1][(i+k)%n]>s[1][(j+k)%n]) i+=k+1,k=0;        else j+=k+1,k=0;        if(i==j)        i++;    }    y=min(i,j);bool ac=1;    for(i=0;i<n;i++)    {        if(s[0][(x+i)%n]!=s[1][(y+i)%n])        {            ac=0;            break;        }    }    if(!ac)    puts("No");    else    {        puts("Yes");        for(int i=0;i<n;i++)        printf("%c",s[0][(i+x)%n]);    }    return 0;}