char *longestPalindrome(char *s)
{
        int len = strlen(s);
        if (len <= 1) return s;
        char *T = transString(s);
        int tlen = strlen(T);
	printf("T:%s\n",T);
        int *P = (int *)calloc(tlen, sizeof(int));
        memset(P, 0 ,tlen*sizeof(int));
        int id = 0, mx= 0;
        for (int i = 1; i < tlen-1; i++) {
                if (id > 0 && (mx-i) >=0)
                    P[i] = (mx > i) ? (P[2 * id -i] < (mx-i) ? P[2*id -1] : mx-i) : 0;
                // while (*(T+i+1+P[i]) == *(T+i-1-P[i])) {
                //         P[i]++;
                // }
                while ((i-1-P[i])>=0) {
                        if (*(T+i+1+P[i]) == *(T+i-1-P[i]))
                                P[i]++;
                        else 
                                break;
                }
                if (i + P[i] > mx) {
                        id = i;
                        mx = i + P[i];
                }
        }

        int maxlen = 0, centerIndex = 0;
        for (int j = 1; j < tlen-1; j++) {
                if (P[j] > maxlen) {
                        maxlen = P[j];
                        centerIndex = j;
                }
        }
        free(T);
        T=NULL;
        free(P);
        P=NULL;
        char *subs = (char *)malloc(maxlen * sizeof(char)+1);
        memset(subs,0,maxlen*sizeof(char));
        strncat(subs,s+(centerIndex-maxlen)/2,maxlen);
	printf("s:%s\nsubs:%s\n",s,subs);
        return subs;
}
Пример #2
0
int main(int argc, char* argv[])
{
    char first_name[MAX_NAME_LEN], last_name[MAX_NAME_LEN];
    char credit_str[MAX_NAME_LEN], amount_int_str[STR_LEN], temp[STR_LEN];
    unsigned int month, year, secure_code, zip;
    unsigned int amount_int, amount_frac;
    unsigned int ret;
    char local_name[MAX_NAME_LEN+1], domain_name[MAX_DOMAIN_LEN+1];

    if (argc != 1 )
    {
        printf("Usage: sainting\n");
        return -1;
    }


    //input first name
    do
    {
        memset(first_name, 0, MAX_NAME_LEN);
        printf("Please input your first name [continue letters, space is not supported, no more than 63], press ENTER when done:\n");
        ret = getCString(first_name, MAX_NAME_LEN);
        if (ret)
        {
            errorHandle(ret);
            //return -2;
        }
    }while(ret);
    //transfer string format
    transString(first_name); 

    //input last name
    do
    {
        memset(last_name, 0, MAX_NAME_LEN);
        printf("Please input your last name [continue letters, space is not supported, no more than 63], press ENTER when done:\n");
        ret = getCString(last_name, MAX_NAME_LEN);
        if (ret)
        {
            errorHandle(ret);
            //return -3;
        }
    }while(ret); 
    //transfer string format
    transString(last_name);

    //input credit card number
    do
    {
        memset(credit_str, 0, MAX_NAME_LEN);
        printf("Please input creadit card number (16 digits), press ENTER when done:\n");    
        ret = getNString(credit_str, CREDIT_CARD_LEN+1);
        if (ret)
        {
            errorHandle(ret);
            //return -4;
        }
    }while(ret);
 

    //input month
    do
    {
        month = 0;
        memset(temp, 0, STR_LEN);
        printf("Please input expiration month xx (2 digits 01~12), press ENTER when done:\n");
        ret = getNString(temp, MONTH_LEN+1);
        if (!ret)
        {
            month = atoi(temp);
            if ( (month>=1) && (month<=12) )
            {
                //do nothing
            }   
            else
            {
                ret = ERR_OUT_OF_RANGE;
            }
        }
        if (ret)
        {
            errorHandle(ret);
            //return -5;
        }
    }while(ret);


    //input year
    do
    {
        year = 0;
        memset(temp, 0, STR_LEN);
        printf("Please input expiration year xxxx (4 digits, 1985~2011), press ENTER when done:\n");
        ret = getNString(temp, YEAR_LEN+1);
        if (!ret)
        {
            year = atoi(temp);
            if ( (year>=1985) && (year<=2011) )
            {
                //do nothing
            }
            else
            {
                ret = ERR_OUT_OF_RANGE;
            }
        }
        if (ret)
        {
            errorHandle(ret);
            //return -6;
        }
    }while(ret);


    //input security code
    secure_code = 0;
    do
    {
        memset(temp, 0, STR_LEN);
        printf("Please input security code xxx (3 digits), press ENTER when done:\n");
        ret = getNString(temp, SECURE_CODE_LEN+1);
        if (ret)
        {
            errorHandle(ret);
            //return -7;
        }
    }while(ret);
    secure_code = atoi(temp);



    //input zip code
    zip = 0;
    do
    {
        memset(temp, 0, STR_LEN);
        printf("Please input zip code xxxxx (5 digits), press ENTER when done:\n");
        ret = getNString(temp, ZIP_LEN+1);
        if (ret)
        {
            errorHandle(ret);
            //return -8;
        }
    }while(ret);
    zip = atoi(temp);


    //input purchase amount
    do
    {
        amount_int = 0;
        amount_frac = 0;
        printf("Please input purchase amount A.B (A <= 9 digits, B <= 2 digits), press ENTER when done:\n");
        ret = getDollarNum(&amount_int, 9, &amount_frac, 2); 
        if (ret)
        {
            errorHandle(ret);
            //return -9;
        }
    }while(ret);

    memset(amount_int_str, 0, STR_LEN);
    transNum(amount_int_str, amount_int);

    //input email address
    do
    {
        memset(local_name, 0, MAX_NAME_LEN+1);
        memset(domain_name, 0, MAX_DOMAIN_LEN+1);
        printf("Please input email address A@B (A's len <= 64, B's len <= 253. '[]' is not support in domain name), press ENTER when done:\n");
        ret = getEmailLname(local_name, MAX_NAME_LEN+1);
        if (ret)
        {
            errorHandle(ret);
            //return -10;
        }
        else
        {
            ret = getEmailDname(domain_name, MAX_DOMAIN_LEN+1);
            if (ret)
            {
                errorHandle(ret);
                //return -11;
            }
        }
    }while(ret);

    // print result
    printf("\nSummary\n");
    printf("=================================================\n");
    printf("Name                       <%s %s>\n", first_name, last_name);
    printf("Credit card number         %c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c\n",
            credit_str[0], credit_str[1], credit_str[2], credit_str[3],
            credit_str[4], credit_str[5], credit_str[6], credit_str[7],
            credit_str[8], credit_str[9], credit_str[10], credit_str[11],
            credit_str[12], credit_str[13], credit_str[14], credit_str[15]);
    printf("Expiration month and year  <%s %d>\n", monthStr[month-1], year);
    printf("Security code              %d\n", secure_code);
    printf("Zip code                   %d\n", zip);
    printf("Purchase amount            %s.%02d\n", amount_int_str, amount_frac);
    printf("Email address              <%s@%s>\n", local_name, domain_name);
    printf("\n");
    return 0;
}