【备战蓝桥杯】USACO--> calfflac 奶牛回文
2014-02-04 13:14
411 查看
题目地址:http://wikioi.com/problem/1568/
昨天实在太累了,就稍微看了一下题目,分析了一下,发现在不佳的状态下分析问题,越分析越累= =
然后,今天起来继续看,参考了一下之后,经过几番周折,终于还是实现了。不容易呀。
思路也很直接,爆搜。从第一个字符开始,向两边出发判断回文。发现不相等的字符或者出界了就停止,继续下一个的判断。
需要注意的问题,也是我实现过程中出的问题:
1、判断是不是字符的函数,可以使用<ctype.h>里面的 isalpha函数判断;
2、由于输入中含有空格和回车符,因此,普通的%s是不行的,它遇到空格就读取完毕了。
"%2000[^EOF]" scanf的正则表达式,意思是,可以最大输入2000个字符,一直读取,直到读取到'EOF'字符,就跳出;
3、要记录的是带有字符数据的下标,不是非字符;
4、字符统一成小写或者大写来判断;
昨天实在太累了,就稍微看了一下题目,分析了一下,发现在不佳的状态下分析问题,越分析越累= =
然后,今天起来继续看,参考了一下之后,经过几番周折,终于还是实现了。不容易呀。
思路也很直接,爆搜。从第一个字符开始,向两边出发判断回文。发现不相等的字符或者出界了就停止,继续下一个的判断。
需要注意的问题,也是我实现过程中出的问题:
1、判断是不是字符的函数,可以使用<ctype.h>里面的 isalpha函数判断;
2、由于输入中含有空格和回车符,因此,普通的%s是不行的,它遇到空格就读取完毕了。
"%2000[^EOF]" scanf的正则表达式,意思是,可以最大输入2000个字符,一直读取,直到读取到'EOF'字符,就跳出;
3、要记录的是带有字符数据的下标,不是非字符;
4、字符统一成小写或者大写来判断;
//从中间向两边爆搜 #include <stdio.h> #include <ctype.h> #include <string.h> int beg=0; int end=0; int max=0; //提取字符出来比较; 记录回文的字符的开头结尾; 记录回文中字符数 //奇数回文判断 void check(char *input,int poi,int len) { int l = poi-1,r = poi+1; int lst_beg= l,lst_end = r; int count=0; //判断最中间的字符是否是字母 if( isalpha(input[poi])) { count=1; } for( ;l >= 0 && r < len ; ) { if(!isalpha(input[l])) { l--; } else if(!isalpha(input[r])) { r++; } //字符统一成小写的 else if( tolower(input[l]) == tolower(input[r])) { //记录上一次,是字符的位置 lst_beg = l; lst_end = r; l--; r++; count +=2; } //发现不相等的字符; 立即处理 else { break; } } //超出界限判断 if( count > max) { beg = lst_beg; end = lst_end; max = count; } } //偶数回文判断 void check2(char *input,int poi,int len) { int l=poi,r=poi+1; int count=0; int lst_beg= l,lst_end = l; for( ;l >= 0 && r < len ; ) { if(!isalpha(input[l])) { l--; } else if(!isalpha(input[r])) { r++; } //字符统一成小写的 else if( tolower(input[l]) == tolower(input[r])) { lst_beg = l; lst_end = r; l--; r++; count +=2; } //发现不相等的字符; 立即处理 else { break; } } //超出界限判断 if( count > max) { beg = lst_beg; end = lst_end; max = count; } } int main() { char input[20010]; int i; char c; //直到输入的文件尾才结束 scanf("%20010[^EOF]",input); /* for(i=0 ; (c=getchar()) != EOF ; i++) { input[i] = c; } */ int len = strlen(input); //int len = i; for(i=0 ; i < len ; i++) { check(input,i,len); check2(input,i,len); } input[end+1] = '\0'; printf("%d\n%s",max,input+beg); return 0; }
相关文章推荐
- 【备战蓝桥杯】USACO--> Beads 2.0
- 【备战蓝桥杯】USACO-->barn(未完)
- 【备战蓝桥杯】USACo--> airpro【改变策略】
- 【备战蓝桥杯】USACO-> Beads
- 【备战蓝桥杯】USACO--> Milking Cows[2]
- 【备战蓝桥杯】USACO--> Transformation
- 【备战蓝桥杯】USACO-->crypt
- 【备战蓝桥杯】USACO-->palsquare
- 【备战蓝桥杯】USACO--> milk
- 【备战蓝桥杯】USACO--> barn (终结)
- 【备战蓝桥杯】USACO--> Milking Cows[1]
- 【备战蓝桥杯】USACO-->dualpul
- USACO 1.3 Calf Flac (最长回文子串 DP动态规划)
- 【最长回文字串】Calf Flac 最长的回文 (Usaco_Training 1.3)
- USACO 1.3.4 Calf Flac(最大回文子串)
- USACO Section 1.3 PROB Calf Flac(最长回文子串)
- <备战蓝桥杯之嵌入式>——USART
- 【最长回文字串】Calf Flac 最长的回文 (Usaco_Training 1.3)
- <备战蓝桥杯之嵌入式>——SYSTICK
- <备战蓝桥杯之嵌入式>——BUTTON按键实验