[BZOJ1398]-最小表示法模板题

本文介绍了一个基于最小表示法的问题——判断两条项链是否相同。通过分析和代码实现,展示了如何找到并比较两个序列的最小表示形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说在前面

翻课件的时候发现自己还没学过最小表示法,于是去补了一道板子题=w=
安总赛高!阿岚赛高!


题目

BZOJ1398传送门

题面

这里写图片描述
现在给出两个项链的表示,请判断是否是同一条项链

输入输出格式

输入格式:
输入文件共两行,每行一个由0至9组成的字符串,描述一个项链的表示

输出格式:
如果两个项链不同,输出No
不然输出Yes,并在第二行输出项链的最小表示


题解

最小表示法模板题
关于最小表示法的资料不少,me就懒得打了…
推荐这两个(结合着看):
周源《浅析“最小表示法”思想在字符串循环同构问题中的应用》 第23页到第37页
XGHeaven-最小表示法 讲解部分
具体实现可以自行YY


下面是自带大常数的代码

/**************************************************************
    Problem: 1398
    User: Izumihanako
    Language: C++
    Result: Accepted
    Time:156 ms
    Memory:4728 kb
****************************************************************/
 
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
 
int lena , lenb ;
char a[2000005] , b[2000005] ;
 
void GG(){
    puts( "No" ) ;
    exit( 0 ) ; 
}
 
int getmin( char *ss , int len ){
    int i = 0 , j = 1 , k = 0 ;
    for( ; i < len && j < len && k < len ; ){
        if( ss[i+k] != ss[j+k] ){
            if( ss[i+k] > ss[j+k] ){
                i = max( j , i + k + 1 ) ;
                j = i + 1 ;
            } else j = j + k + 1 ;
            k = 0 ;
        } else k ++ ;
    }
    return i ;
}
 
bool check( int pa , int pb ){
    for( int k = 0 ; k < lena ; k ++ )
        if( a[ pa+k ] != b[ pb+k ] ) return false ;
    return true ;
}
 
void solve(){
    int pos_a = getmin( a , lena ) ,
        pos_b = getmin( b , lenb ) ;
    if( check( pos_a , pos_b ) ){
        puts( "Yes" ) ;
        for( int k = 0 ; k < lena ; k ++ )
            putchar( a[ pos_a+k ] ) ;
    } else GG() ;
}
 
int main(){
    scanf( "%s%s" , a , b ) ;
    lena = strlen( a ) ;
    lenb = strlen( b ) ;
    if( lena != lenb )
        GG() ;
     
    for( int i = 0 ; i < lena ; i ++ )
        a[i+lena] = a[i] , b[i+lenb] = b[i] ;
    solve() ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值