首页 > 其他分享 >最小最大表示法

最小最大表示法

时间:2024-04-22 21:35:28浏览次数:19  
标签:char 最大 int 最小 len else 表示法 str

#include <iostream>
#include <cstring>

using namespace std;

const int N = 2000010;

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

int get_min(char s[]) {
    
    int i = 0, j = 1;
    while (i < n && j < n) {
        int k = 0;
        while (k < n && s[i + k] == s[j + k]) k++;
        if (s[i + k] > s[j + k]) i += k + 1;
        else j += k + 1;
        
        if (i == j) i++;
    }
    int k = min(i, j);
    s[k + n] = '\0';//找到起始位置后,右边边界赋为0。比较到这个位置会挺 
    return k;//k就是最小表示法的起始位置 
}
/*把字符赋为0,和赋为'\0' 效果是一样的*/
/*但是赋值97  和  赋值'a'  效果就不一样*/
int main() {
    
    scanf("%s%s", a, b);
    
    n = strlen(a);
    memcpy(a + n, a, n);
    memcpy(b + n, b, n);
    
    int x = get_min(a), y = get_min(b);//分别得到两者的最小表示法的起始位置
	//利用的原理就是,如果最小表示法相同,那么两者一定循环同构 
    if (strcmp(a + x, b + y)) puts("No");
    else {
        puts("Yes");
        puts(a + x);
    }
    
    return 0;
}

下面贴了两个,分别是最大小表示法

#include<bits/stdc++.h>
using namespace std;
const int  MAX_N = 1e5+9;
char str[MAX_N] = "56472819";
int getMin(char * str)
{
    int len = strlen(str);
    int i=0,j=1;
    int k;
    while(i<len && j<len)
    {
        for(k=0;k<len;k++)
        {
            if(str[(i+k) % len] != str[(j+k) % len]) break;
        }
        if(k >= len ) break;
        if(str[(i+k) % len] > str[(j+k) % len] )
        {
            if(i+k+1 > j) i = i+k+1;
            else i = j+1;
        }
        else if(j+k+1 > i) j = j+k+1;
        else j = i+1;
    }
    return i<j?i:j;
}
int getMax(char * str)
{
    int len = strlen(str);
    int i =0,j=1;
    int k;
    while(i<len && j<len)
    {
        for(k=0;k<len;k++)
        {
            if(str[(i+k)%len] != str[(j+k)%len] ) break;
        }
        if(k >= len) break;
        if(str[(i+k) % len] < str[(j+k) % len])
        {
            if(i+k+1 > j) i = i+k+1;
            else i = j+1;
        }
        else if(j+k+1 > i) j = j+k+1;
        else j = i+1;
    }
    return i<j?i:j;
}
int main()
{
    cout<<getMin(str)<<endl;
    cout<<getMax(str)<<endl;
}


标签:char,最大,int,最小,len,else,表示法,str
From: https://www.cnblogs.com/yzzyang/p/18151585

相关文章

  • 删除链表中(有头节点)一个最小值节点
    删除链表中(有头节点)一个最小值节点/********************************************************************** name : deletelinkedlist* function:删除链表中(有头节点)一个最小值节点* argument:* @Head:链表结构体头头节点地址** retval :调用成功......
  • 洛谷 P1719 最大加权矩形
    使用前缀和进行数据的预处理再使用遍历查找最大加权矩形#include<bits/stdc++.h>usingnamespacestd;intb[125][125];intmain(){//初始化最小值intn,ans=-99999999;cin>>n;for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){inta;......
  • 设计一个算法删除单链表L(有头节点)中的一个最小值结点
    数据结构链表笔试题:设计一个算法删除单链表L(有头节点)中的一个最小值结点。/****************************************************************** * filename : linkedlist.c* author : [email protected]* data : 2024/04/22* function : 删除单链表中的一个最小......
  • 设计一个算法删除单链表L(有头结点)中的一个最小值结点
    设计一个算法删除单链表L(有头结点)中的一个最小值结点/********************************************************************* 函数名称: LList_delatemin* 函数功能:删除单链表L(有头结点)中的一个最小值结点* 函数参数:* @a:*L*@b:*返回......
  • 删除链表中最小的一个结点
    include<stdio.h>include<stdbool.h>include<stdlib.h>//指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表的结点,链表中所有结点的数据类型应该是相同的typedefstructLinkedList{DataType_tdata;//结点......
  • 《渣男代码历险记》第五章:设计一个算法删除单链表L(有头结点)中的一个最小值结点
    为了删除单链表L中的一个最小值结点,我们可以遍历链表,找到最小值结点及其前驱结点,然后修改前驱结点的指针,使其指向最小值结点的下一个结点。以下是算法的解析和代码实现:初始化两个指针pre和cur,分别指向头结点和头结点的下一个结点。初始化一个变量min_val,用于存储当前最小值,将其......
  • 【每周例题】力扣 C++ 最小和分割
    最小和分割题目 题目分析1.num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。即,num1与num2是从num中提取出来的,且不会重复提取同一个数字,且提取的顺序并不需要按照num的数字顺序2.返回 num1 和 num2 可以得到的和的最小值。要想得到最小值,需......
  • 对链表中最小数据项对应的结点删除
    //指的是顺序表中的元素的数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表SeqList—_t的结点,结点中包含数据域和指针域,并且所有结点中的数据应该相同typedefstructSeqList{DataType_tData;structSeqList*next;}LinkList_t;//创建......
  • 设计一个算法删除单链表L(有头结点)中的一个最小值结点。
    思路1:定义一个变量=遍历每一个当前地址下面的数据和下一个作比较,谁小把谁的值给这个变量,同时记录这个小值的位置i,依次遍历比较,得到最小值和最小值的结点i的值,然后删除这个结点。思路2:给两个指针,p1,p2开始都指向第一个,然后p2指向下一个地址,和p1下的data作比较,得到的小值的p不动......
  • 最大公约数和最小公倍数
    最大公约数(GCD)和最小公倍数(LCM)最大公约数定义:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数;几个自然数公有的约数,叫做这几个自然数的公约数;公约数中最大的一个公约数,称为这几个自然数的最大公约数(greatestcommond......