hdu 3925 Substring a至少加上多少,会含有b

本文深入探讨了AI音视频处理领域中的关键技术,特别是视频分割与语义识别,详细解释了如何利用这些技术实现更智能的音视频处理应用。

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

Problem Description
Give you two number a, b. Output the smallest number that can be added to a to contain the number b as a substring.
 

Input
The first line contains a single positive integer T( T <= 500 ), indicates the number of test cases.
For each test case: Two number a,b;
  0 <= a <= 10^100, 0 <= b <= 10^7
 

Output
For each test case: output the case number as shown and the smallest number that satisfy the description.
 

Sample Input
2 9 1 9 2
 

Sample Output
Case #1: 1 Case #2: 3

//


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=150;
void out(int a[maxn],int la)
{
    for(int i=0;i<la;i++) printf("%d",a[i]);printf("\n");
}
int OK(int a[maxn],int la,int b[maxn],int lb)//判断a是否包含b
{
    for(int i=0;i<la;i++)
    {
        int j;
        for(j=0;j<lb&&i+j<la;j++)
        {
            if(b[j]!=a[i+j]) break;
        }
        if(j==lb) return 1;
    }
    return 0;
}
int compare(int a[maxn],int la,int b[maxn],int lb)
{
    if(la<lb) return -1;
    if(la>lb) return 1;
    for(int i=0;i<la;i++)
    {
        if(a[i]>b[i]) return 1;
        else if(a[i]<b[i]) return -1;
    }
    return 0;
}
//a>b  a-b=c
void sub(int a[maxn],int la,int b[maxn],int lb,int c[maxn],int &lc)
{
    lc=0;
    int i=la-1,j=lb-1;
    for(;i>=0&&j>=0;i--,j--)
    {
        if(a[i]>=b[j]) c[lc++]=a[i]-b[j];
        else
        {
            c[lc++]=a[i]+10-b[j];
            a[i-1]--;
        }
    }
    for(int k=i;k>=0;k--) if(a[k]<0) a[k]+=10,a[k-1]--;
    for(;i>=0;i--)c[lc++]=a[i];
    for(int k=lc-1;k>=0;k--)
    {
        if(c[k]==0) lc--;
        else break;
    }
    reverse(c,c+lc);
}
int a[maxn],b[maxn],c[maxn];
int la,lb,lc;
char str[maxn];
int len;
int ans[maxn];
int lans;
int f[maxn],g[maxn];
int lf,lg;
int main()
{
    int ci,pl=1;scanf("%d",&ci);
    while(ci--)
    {
        lans=-1;
        scanf("%s",str);
        len=strlen(str);la=len;
        for(int i=0;i<len;i++) a[i]=str[i]-'0';
        scanf("%s",str);
        len=strlen(str);lb=len;
        for(int i=0;i<len;i++) b[i]=str[i]-'0';
        printf("Case #%d: ",pl++);
        if(OK(a,la,b,lb))
        {
            printf("0\n");
            continue;
        }
        //a<b
        if(compare(a,la,b,lb)<0)
        {
            sub(b,lb,a,la,c,lc);
            out(c,lc);
            continue;
        }
        //a>b
        for(int now=la-1;now>=-1;now--)//枚举b的末尾在a中的位置
        {
            int l=now+1-lb,r=now;
            len=lb;
            int flag=0;
            if(l>=0){
            for(int i=l,j=0;i<=r;i++,j++)
            {
                if(a[i]>b[j]) flag=1;
                else if(a[i]<b[j]) flag=-1;
                if(flag) break;
            }
            }
            else flag=-1;
            lf=lg=0;
            for(int i=max(l,0);i<la;i++) f[lf++]=a[i];
            if(flag<0)
            {
                for(int i=0;i<lb;i++) g[lg++]=b[i];
                for(int i=r+1;i<la;i++) g[lg++]=0;
            }
            else
            {
                g[lg++]=1;
                for(int i=0;i<lb;i++) g[lg++]=b[i];
                for(int i=r+1;i<la;i++) g[lg++]=0;
            }
            sub(g,lg,f,lf,c,lc);
            if(lans==-1||compare(c,lc,ans,lans)<0)
            {
                lans=lc;
                memcpy(ans,c,sizeof(c));
            }
        }
        out(ans,lans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值