算法竞赛进阶指南---0x18 (最小表示法)Necklace

题面

在这里插入图片描述

题解

  1. 对于两个相同的字符串,我们可以直接比较它们的字典序最小的串是否相等即可,求最小字典序直接用最小表示法O(n)即可
  1. 最小表示法解释 :–>点这里

代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

const int N = 2000000;

int n;
char a[N], b[N];

int get_min(char str[]) {
    
    
    int i = 0, j = 1;
    while (i < n && j < n) {
    
    
        int k = 0;
        while (k < n && str[i + k] == str[j + k]) k++;
        if (k == n) break;
        if (str[i + k] > str[j + k]) i += k + 1;
        else j += k + 1;
        if (i == j) i++;
    }
    int res = min(i, j);
    str[res + n] = 0;
    return res;
}

int main() {
    
    
    scanf("%s%s", a, b);
    n = strlen(a);

    memcpy(a + n, a, n);
    memcpy(b + n, b, n);

    int ia = get_min(a), ib = get_min(b);

    if (strcmp(a + ia, b + ib)) puts("No");
    else {
    
    
        puts("Yes");
        puts(a + ia);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44791484/article/details/113934369