andre_joy

导航

USACO calfflac

题意:找到一个字符串里面最长的回文字符串。

mark:做了这题真是感叹,对不会文件读写的人来说,文件读写真是逆天啊。。。而且USACO居然不用考虑效率问题,O(n^2)都能过。

    总结一下文件读写。

    把文件导入导出有两种方法:

FILE *fin, *fout;
fin = fopen("***", "rb");
fout = fopen("***", "wb");
freopen("***", "r", stdin);
freopen("***", "w", stdout);

    从文件读字符或者字符串通过fgetc和fgets来读取。

char a;
a = fgetc(fin);
char a[100];
fgets(a, 100, fin);  //第二个参数是该字符串的大小上限。

代码:

/*
ID: andre_j2
LANG: C
TASK: calfflac
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20010

char a[N], s[N];
int flag[N];
int ans, l, r;

main()
{
    FILE *fin;
    fin = fopen("calfflac.in", "rb");
    freopen("calfflac.out", "w", stdout);
    int i,j,k;
    i = 0;
    while((a[i++] = fgetc(fin)) != EOF);
    a[i] = '\0';
    ans = 0;
    for(i = j = 0; a[i]; i++)
    {
        if((a[i]|32) >= 'a' && (a[i]|32) <= 'z')
        {
            flag[j] = i;
            s[j++] = (a[i]|32);
        }
    }
    for(i = 0; i < j; i++)
    {
        for(k = 0; i-k >= 0 && i+k < j; k++)
        {
            if(s[i-k] != s[i+k]) break;
            if(2*k+1 > ans)
            {
                ans = 2*k+1;
                l = i-k;
                r = i+k;
            }
        }
        for(k = 0; i-k >= 0 && i+k+1 < j; k++)
        {
            if(s[i-k] != s[i+k+1]) break;
            if(2*k+2 > ans)
            {
                ans = 2*k+2;
                l = i-k;
                r = i+k+1;
            }
        }
    }
    printf("%d\n", ans);
    for(i = flag[l]; i <= flag[r]; i++)
        printf("%c", a[i]);
    printf("\n");
    exit(0);
}

posted on 2012-11-06 11:37  andre_joy  阅读(273)  评论(0编辑  收藏  举报