HDU 4167 User Names

来源:互联网 发布:mysql update if 编辑:程序博客网 时间:2024/05/17 02:46

题意:根据输入顺序,如果有姓名相同的串,将最后的尾数在要求范围内加上数字下标

当时写的时候写到最后已经很难受了,好在最后把这个题水了出来,一遍AC

代码很长很麻烦,有好的方法大家可以告诉我一下

代码如下

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<iostream>using namespace std;char a[200+10][80+10];char b[200+10][80+10];int js[200+10];bool db(char *a,char *b){    int la=strlen(a),lb=strlen(b);    if(la!=lb) return false;    for(int i=0; i<la; i++)        if(a[i]!=b[i]) return false;    return true;}bool iszm(char c){    if(c>='a'&&c<='z') return true;    return false;}int main(){    int n,maxlen,cases=1;    while(scanf("%d%d",&n,&maxlen)&&n)    {        getchar();        memset(js,0,sizeof(js));        memset(b,0,sizeof(b));        for(int i=0; i<n; i++)        {            gets(a[i]);            int l=strlen(a[i]);            for(int j=0; j<l; j++)            {                if(a[i][j] >='A'&&a[i][j] <='Z') a[i][j]=a[i][j]-'A'+'a';            }        }        for(int i=0; i<n; i++)        {            int len=strlen(a[i]);            b[i][0]=a[i][0];            int jl=0;            for(int j=len-1; j>=0; j--)            {                if(a[i][j]==' ')                {                    jl=j+1;                    break;                }            }            int num=1;            for(int k=jl; k<len; k++)            {                if(iszm(a[i][k]))                {                    b[i][num]=a[i][k];                    ++num;                }                if(num>maxlen-1) break;            }        }        printf("Case %d\n",cases++);        for(int i=0; i<n; i++)        {            int flag=1,num=0;            for(int j=0; j<=i; j++)            {                if(db(b[i],b[j]))                {                    flag=0;                    num=js[j];                    if(num==0)                    {                        printf("%s",b[i]);                    }                    else if(num<10)                    {                        int kz=maxlen-strlen(b[i]);                        for(int l=0; l<strlen(b[i])-1+kz&&b[i][l]!=0; l++)                            printf("%c",b[i][l]);                        printf("%d",num);                    }                    else if(num>=10&&num<100)                    {                        int kz=maxlen-strlen(b[i]);                        for(int l=0; l<strlen(b[i])-2+kz&&b[i][l]!=0; l++)                            printf("%c",b[i][l]);                        printf("%d",num);                    }                    else                    {                        int kz=maxlen-strlen(b[i]);                        for(int l=0; l<strlen(b[i])-3+kz&&b[i][l]!=0; l++)                            printf("%c",b[i][l]);                        printf("%d",num);                    }                    js[j]++;                    printf("\n");                    break;                }            }        }    }}


0 0