USACO/Calf Flac

USACO/Calf Flac

Posted by dym on February 15, 2014

本文迁移自老博客,原始链接为 https://seven.blog.ustc.edu.cn/usacocalf-flac/

寻找最长的回文,寻找回文时忽略标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母’A’-‘Z’和’a’-‘z’。 解法:先处理一下字符串,使其变成全小写字母,然后枚举判断。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct posi
{
    int n;
    char a;
}hi[20001];
int main()
{
    FILE *fin = fopen ("calfflac.in", "r");
    FILE *fout = fopen ("calfflac.out", "w");
    char str[20001];
    char str1[20001];
    char tmp[81];
    char c;
    while( fgets (tmp, 80, fin) != NULL)
    {
       strcat(str, tmp);
    }
    int len = strlen(str);
    str[len] = '\0';
    int t =0 ;
    for(int i = 0; i < len ;i++)
    {
        if((isupper(str[i])) || (islower(str[i])))
        {
            hi[t].a = tolower(str[i]);
            hi[t].n = i;
            str1[t++] = tolower(str[i]);
        }
    }
    str1[t] = '\0';
    int num  = 1,tem;
    int maxn = 0;
    for(int i = 0; i < t - 1 ; i++)
    {
        int r;
        if(str1[i] == str1[i + 1])
        {
            num = 2;
            r = 1;
            while((i - r >= 0) && (i + 1 + r < t))
            {
                if(str1[i - r] == str1[i + 1 + r])
                {
                    num += 2;
                    r++;
                }
                else
                {
                    break;
                }
            }
        }
        if(num > maxn)
        {
            maxn = num;
            tem = i;
        }
        num = 1;
        int r1 = 1;
        while((i - r1 >= 0) && (i + r1 < t))
        {
            if(str1[i - r1] == str1[i + r1])
            {
                num += 2;
                r1++;
            }
            else
            {
                break;
            }
        }
        if(num > maxn)
        {
            maxn = num;
            tem = i;
        }
    }
    fprintf(fout,"%d\n" , maxn);
    if(maxn % 2 == 0)
    {
        int s = hi[tem - (maxn / 2 ) + 1].n;
        int e = hi[tem + (maxn / 2)].n;
        for(int i = s;i <= e; i++)
        {
            fprintf(fout,"%c", str[i]);
        }
    }
    else
    {
        int s = hi[tem - (maxn / 2 )].n;
        int e = hi[tem + (maxn /2)].n;
        for(int i = s;i <= e; i++)
        {
            fprintf(fout,"%c", str[i]);
        }
    }
    fprintf(fout,"\n");
    fclose(fin);
    fclose(fout);
    return 0;
}