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); }