Calf Flac
It is said that if you give an infinite number of cows an infinite number of heavy-duty laptops (with very large keys), that they will ultimately produce all the world's great palindromes. Your job will be to detect these bovine beauties.
Ignore punctuation, whitespace, numbers, and case when testing for palindromes, but keep these extra characters around so that you can print them out as the answer; just consider the letters `A-Z' and `a-z'.
Find the largest palindrome in a string no more than 20,000 characters long. The largest palindrome is guaranteed to be at most 2,000 characters long before whitespace and punctuation are removed.
PROGRAM NAME: calfflac
INPUT FORMAT
A file with no more than 20,000 characters. The file has one or more lines which, when taken together, represent one long string. No line is longer than 80 characters (not counting the newline at the end).
SAMPLE INPUT (file calfflac.in)
Confucius say: Madam, I'm Adam.
OUTPUT FORMAT
The first line of the output should be the length of the longest palindrome found. The next line or lines should be the actual text of the palindrome (without any surrounding white space or punctuation but with all other characters) printed on a line (or more than one line if newlines are included in the palindromic text). If there are multiple palindromes of longest length, output the one that appears first.
SAMPLE OUTPUT (file calfflac.out)
11 Madam, I'm Adam
题意:
给出一个字符串句子,找出这个字符串最大的回文串数量,并输出这个回文串语句(判断回文串是不包括标点符号和空格在内的)。
思路:
一个个点进行查找,从该点开始向左右扩展找出最大回文串值,并记录首和尾的位置。回文串分为两种情况,分别为奇数和偶数的情况,分别计算和统计。
first and wrong:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define BOR 20000+5 int same(char a,char b) { if(a==b) return 1; if(a==b-32) return 1; if(a-32==b) return 1; return 0; } int main() { char pos[BOR]; int i,length,max=0,l,r,sum,from,to; gets(pos); length=strlen(pos); // printf("\n%s\n",pos); //循环不是从0开始的,所以如果数组只有pos[0]的话,则程序会出现错误 for(i=1;i<length;i++) { if((pos[i]<'A'||pos[i]>'Z')&&(pos[i]<'a'||pos[i]>'z')) continue; l=i-1; r=i+1; sum=1; //这是只有回文串是单数的时候的情况 // printf("\nr=%d\n",r); // printf("%c",pos[11]); while((pos[l]<'A'||pos[l]>'Z')&&(pos[l]<'a'||pos[l]>'z')&&l>=0) l--; while((pos[r]<'A'||pos[r]>'Z')&&(pos[r]<'a'||pos[r]>'z')&&(r<length)) r++; //这里的判断条件没有=,细心! // printf("\nl=%d\nmid=%d\nr=%d\n",l,i,r); // system("pause"); while(l>=0&&r<length&&same(pos[l],pos[r])) { sum+=2; l--; r++; while((pos[l]<'A'||pos[l]>'Z')&&(pos[l]<'a'||pos[l]>'z')&&l>=0) l--; while((pos[r]<'A'||pos[r]>'Z')&&(pos[r]<'a'||pos[r]>'z')&&r<length) r++; // printf("\nl=%d\nr=%d\n",l,r); // printf("sum=%d\n",sum); // system("pause"); } if(sum>max) { max=sum; from=l+1; to=r-1; } // printf("\nl=%d\nr=%d\n",l,r); // printf("max=%d\n",max); // system("pause"); } // printf("\nfrom=%d\nto=%d\n",from,to); while((pos[from]<'A'||pos[from]>'Z')&&(pos[from]<'a'||pos[from]>'z')&&from>=0) from++; while((pos[to]<'A'||pos[to]>'Z')&&(pos[to]<'a'||pos[to]>'z')&&to<length) to--; //方法可行 //但是存在许多容易出错的地方,而且循环从1开始,故会忽略许多情况 //比如但数组长度只有1的时候 printf("%d\n",max); for(from;from<=to;from++) printf("%c",pos[from]); printf("\n"); // system("pause"); return 0; }AC:
#include<stdio.h> #include<string.h> #define BOR 20000+5 //判断是否相等的函数 int same(char a,char b) { if(a==b||a-32==b||a==b-32) return 1; return 0; } int main() { freopen("calfflac.in","r",stdin); freopen("calfflac.out","w",stdout); char pos[BOR]={0},cr[BOR]={0}; char line[85]; int length,i,l,r; int from,to,max=0,sum; //输入部分,看清题意应如何输入字符串的 while(gets(line)!=NULL) { strcat(pos,line); cr[strlen(pos)-1]=1; } length=strlen(pos); for(i=0;i<length;i++) { if((pos[i]<'A'||pos[i]>'Z')&&(pos[i]<'a'||pos[i]>'z')) continue; //当回文串为奇数的时候 l=i; r=i; sum=-1; //巧设,令一开始都为自己本身,长度为-1 while(l>=0&&r<=length-1) { if(!same(pos[l],pos[r])) break; sum+=2; if(sum>max) { max=sum; from=l; to=r; } //比较函数应该在循环内进行,因为循环到这一步的时候,pos[ l ],pos[ r ]不应该是标点符号值 //切它们是相等的字符值,故sum+=2后马上进行判断处理 l--; r++; //判断完后,左编号继续做进,右编号仅需后进 while((pos[l]<'a'||pos[l]>'z')&&(pos[l]<'A'||pos[l]>'Z')&&l>=0) l--; while((pos[r]<'a'||pos[r]>'z')&&(pos[r]<'A'||pos[r]>'Z')&&r<=length-1) r++; } //当回文串为偶数的时候 l=i; r=i+1; sum=0; while(l>=0&&r<=length-1) { if(!same(pos[l],pos[r])) break; sum+=2; if(sum>max) { max=sum; from=l; to=r; } l--; r++; //比较完后,左编号前进一个,右编号后进一个 //前后进后,此时的pos[ l ],pos[ r ]不一定不是标点符号和空格 while((pos[l]<'a'||pos[l]>'z')&&(pos[l]<'A'||pos[l]>'Z')&&l>=0) l--; while((pos[r]<'a'||pos[r]>'z')&&(pos[r]<'A'||pos[r]>'Z')&&r<=length-1) r++; //忽略当前值为标点为标点符号或者为空格的情况 } } printf("%d\n",max); for(i=from;i<=to;i++) { printf("%c",pos[i]); if(cr[i]==1) printf("\n"); } if(cr[to]!=1) printf("\n"); //最终输出 return 0; }总结:
题意非常简单,但是实现方面却很棘手,没 有特别技巧的方法,只能这样子一一列举出来,需要更加细心,更加清晰每一步的操作有什么作用,会带来什么后果。考虑好数组边界问题,哪一步操作应先进行还是后进行。每一个点都要思考清楚才能着手。分析问题还是很容易就分析少了某几种特殊情况,还需继续努力啊。(注意这题的输入,每80个字符为一行,最终组成一个大的字符串数组)。
这题也存在有技巧性的地方:
比如测试奇数回文串的时候运用 l=r=i;sum=-1;这样赋值的话,数组的循环数就可以大胆地从0开始算起,并且如果第一项满足的话也是sum+=2,从而使sum=1,根据判断while(l>=0&&r<=length-1)来决定是否循环一下操作;
同理测试偶数回文串的时候运用l=i;r=i+1;sum=0。
相关推荐
《USACO中的Calf Flac》 USACO(美国计算机奥林匹克)是面向全球青少年的一项编程竞赛,旨在提升参赛者的算法设计与编程能力。在USACO的第一章中,我们经常会遇到各种有趣的题目,其中之一就是"Calf Flac"。这道...
"Prime Cryptarithm"结合了枚举和构造法,而"Calf Flac"则再次运用枚举。 1.4节探讨更多搜索技巧,如"Packing Rectangles"需要完全搜索,"The Clocks"可能需要用到BFS或DFS,或者数学方法。"Arithmetic ...
小牛工作室装备Calf Studio Gear是LINUX操作系统下用于LV2和JACK环境的音频插件包。 该套件包含许多效果(延迟,调制,信号处理,滤波器,均衡器,动态效果,失真和母带效果),乐器(SF2播放器,风琴模拟器和单音...
电化学和光谱法在中性pH条件下对Al(III)促进双链小牛胸腺DNA变性的研究,章福平,曹庆,本文主要研究了在悬汞电极上用微分脉冲伏安法、拉曼光谱以及圆二色光谱法研究双链小牛胸腺DNA(ds-DNA)与Al(III)之间的相互作用...
Dependence of surface-enhanced Raman scattering (SERS) from Calf thymus DNA on anions is investigated. With the silver colloid, the bands at 732, 960 and 1333 cm-1 for adenine (A), 1466 cm-1 for ...
Calf是一个简单的CGI应用程序,用于生成比您的Web服务器更凉爽的文件列表。 它按年和月组织文件,因为它主要用于浏览档案。 它需要一个特定的层次结构,即/YYYY/MM/something/file 。 例如/2014/01/pic/lipsum.jpg ...
CALF、CALF1、CALF2、CALF3指标是波浪买卖主图的一部分,用于计算股票的趋势强度和波动率。这些指标可以帮助投资者判断股票的当前趋势强度和波动率。 出击A、均衡A、趋势向上指标 出击A、均衡A、趋势向上指标是...
比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。(6种解题方法) ... [1, "calf", 3, "piglet"], [1, "calf", 3, 4] 应该返回 ["piglet", 4]。
10. CALF、CALF1、CALF2、CALF3 指标: CALF:=EMA((C/REF(C,10)-1)*100,5); CALF1:=EMA((C/REF(C,10)-1)*100,30); CALF2:=EMA((C/REF(C,10)-1)*100,120); CALF3:=CROSS(CALF,CALF1); 该指标用于计算股票的价格变化...
We used Raman spectroscopy to study the conformational changes of DNA induced by Cd2+ ions in different Cd2+ concentrations solution. The experimental results show that when the Cd^(2+)/PO^(-)_(2) ...
这份文档可能详细解释了如何使用Calf框架来快速开发J2ME应用程序,特别是游戏,可能包括API参考、示例代码和最佳实践。 通过阅读这四本书,读者不仅可以掌握J2ME的基本语法和编程模型,还能了解如何在实际项目中...
在示例中,我们看到如何将文件“aaa”的属组从“root”更改为“calf”,命令为“chgrp calf aaa”。需要注意的是,执行此操作的用户必须是该文件的拥有者或者是root用户,并且指定的属组必须已经存在于系统中。 ...
7. CALF、CALF1、CALF2 和 CROSS:这些是不同周期的相对强弱指数,用于确定短期、中长期的趋势变化,当短期 RSI 跨过中长期 RSI 时,可能预示着价格转折点。 8. B1F、D1F 和 C1F:这三个变量分别基于年份、开盘价和...
SoccerNet:用于足球视频中动作识别的可扩展数据集 [已弃用]请访问 ,以获取该存储库的更新版本 CVPR'18体育计算机视觉研讨会 可在 @InProceedings { Giancola_2018_CVPR_Workshops , author = { Giancola, Silvio ...
文件名看起来不明显,但根据上下文,它可能包含的是一个特定库或框架(如Calf)的使用教程,或者是关于Android音频处理或多媒体开发的指南。Android平台支持丰富的多媒体功能,开发者可以通过这样的教程学习如何在...
11. **CALF**、**CALF1** 和 **CALF2**:这些是基于不同周期的收盘价相对开盘价变化的指数移动平均,用于识别价格趋势。 12. **B1F**、**D1F** 和 **C1F**:这是一组条件判断,分别检查年份、价格走势和日内涨跌...
host.add_plugin ("http://calf.sourceforge.net/plugins/Compressor" ,"compressor" .to_owned (), std:: ptr::null_mut ()).expect ("Lv2hm: could not add plugin" ); host.add_plugin (...