HDU 5920Ugly Problem

来源:互联网 发布:ubuntu安装桌面环境 编辑:程序博客网 时间:2024/06/05 02:43

题意: 拆解成小于等于50个回文串

思路:

从中间分割,使得左右对称,字符串做-法

#include <iostream>#include <stdio.h>#include <cstring>using namespace std;char a[10005];char b[10005];char c[10005];char ans[55][10005];int all=0;                int flag=0;void sub(){    strcpy(c,b);    if(flag)    for(int i=0;i<strlen(c);i++)        c[i]=c[i+1];    all++;    strcpy(ans[all],c);    int len=strlen(a)-1;    int n = len;    int t;    while(len>=0)    {        if(a[len]-b[len]<0)        {            a[len]=a[len]-b[len]+10+'0';            a[len-1]--;        }        else            a[len]=a[len]-b[len]+'0';        if(a[len] != '0') t = len;        len--;    }    for(int i = 0; i <= n - t; i++){        a[i] = a[i + t];    }    a[n - t + 1] = '\0';}int main(){    int t;    scanf("%d",&t);    for(int cs=1; cs<=t; cs++)    {        flag=0;        all=0;        memset(ans,0,sizeof(ans));        scanf("%s",&a);        int i,j;        while(1)        {            if(strlen(a)==1)            {                all++;                strcpy(ans[all],a);                break;            }            if(strlen(a)==2&&a[0]=='1')            {                all++;                memset(c,0,sizeof(c));                c[0]='9';                strcpy(ans[all],c);                int res=0;                for(int i=0;i<2;i++)                    res=res*10+a[i]-'0';                c[0]=res-9+'0';                all++;                strcpy(ans[all],c);                break;            }            strcpy(b,a);            strcpy(c,a);            int tmp=strlen(a);            if(tmp%2==1)            {                i=tmp/2;                j=tmp/2;            }            else            {                i=tmp/2-1;                j=tmp/2;            }            int fi=i,fj=j;            if(a[i]>a[j])            {                a[i]--;                while(i>=0)                {                    b[i]=a[i];                    b[j++]=a[i--];                }            }            else if(a[i]==a[j])            {                if(a[fi]=='0')                {                    a[fi]='9';                    while(a[fi--])                    {                        if(a[fi]!='0')                        {                            if(a[fi]=='1'&&fi==0)                                flag=1;                            a[fi]--;                            break;                        }                        a[fi]='9';                    }                }                else                {                    a[fi]--;                }                if(i==j)                {                    b[j]=a[i];                    if(!flag)                    i--,j++;                    else                        j++;                }                while(i>=0)                {                    b[i]=a[i];                    b[j++]=a[i--];                }                if(flag)                {                    b[0]='0';                    for(int i=1;i<tmp;i++)                        b[i]='9';                    b[tmp]='\0';                }            }            else            {                while(i>=0)                {                    b[i]=a[i];                    b[j++]=a[i--];                }            }            strcpy(a,c);            sub();            if(strlen(a)==1)            {                all++;                strcpy(ans[all],a);                break;            }        }        printf("Case #%d:\n",cs);        printf("%d\n",all);        for(int i=1;i<=all;i++)            printf("%s\n",ans[i]);    }    return 0;}


原创粉丝点击