Calf Flac
To make the programming easier, we keep two copies of the text: the original, and one with the punctuation stripped out. We find the biggest palindrome in the latter copy, and then figure out which part of the original it corresponds to.
To find the biggest palindrome in the alphabetic text, we look, for each letter in the text, at the biggest palindrome centered on that letter (in the case of an odd length palindrome) or just to the right of that letter (in the case of an even length palindrome).
There are 20,000 letters, and we are assured that no palindrome is more than 2,000 letters long, and we search for both even and odd palindromes, for a total of about 20,000*2,000*2 = 80,000,000 operations, which is perfectly reasonable within the time limit.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
char fulltext[21000];
char text[21000];
char *pal;
int pallen;
void
findpal(void)
{
char *p, *fwd, *bkwd, *etext;
int len;
etext = text+strlen(text);
for(p=text; *p; p++) {
/* try palindrome with *p as center character */
for(fwd=bkwd=p; bkwd >= text && fwd < etext && *fwd == *bkwd;
fwd++, bkwd--)
;
bkwd++;
len = fwd - bkwd;
if(len > pallen) {
pal = bkwd;
pallen = len;
}
/* try palindrome with *p as left middle character */
for(bkwd=p, fwd=p+1;
bkwd >= text && fwd < etext && *fwd == *bkwd; fwd++, bkwd--)
;
bkwd++;
len = fwd - bkwd;
if(len > pallen) {
pal = bkwd;
pallen = len;
}
}
}
void
main(void)
{
FILE *fin, *fout;
char *p, *q;
int c, i, n;
fin = fopen("calfflac.in", "r");
fout = fopen("calfflac.out", "w");
assert(fin != NULL && fout != NULL);
/* fill fulltext with input, text with just the letters */
p=fulltext;
q=text;
while((c = getc(fin)) != EOF) {
if(isalpha(c))
*q++ = tolower(c);
*p++ = c;
}
*p = '\0';
*q = '\0';
findpal();
fprintf(fout, "%d\n", pallen);
/* find the string we found in the original text
by finding the nth character */
n = pal - text;
for(i=0, p=fulltext; *p; p++)
if(isalpha(*p))
if(i++ == n)
break;
assert(*p != '\0');
/* print out the next pallen characters */
for(i=0; i<pallen && *p; p++) {
fputc(*p, fout);
if(isalpha(*p))
i++;
}
fprintf(fout, "\n");
exit(0);
}
此题如果能够想到暴力,那么此题容易错的地方就在读入上,要记得是以文件结束符EOF结束输入的,而不是以'\n',因为这个原因而WA了几次。
附我的代码:
/*
ID: xxfz014
PROG: calfflac
LANG: C++
*/
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 20010;
char org[maxn];
struct node
{
int index;
char ch;
};
node s[maxn];
int len;
bool isword(char c)
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z')) return true;
return false;
}
int main()
{
freopen("calfflac.in","r",stdin);
freopen("calfflac.out","w",stdout);
int i=0,len=0;
while(scanf("%c",&org[len++])!=EOF);
//printf("%d\n",len);
//puts(org);
for(int j=0;j<len;j++)
{
if(isword(org[j]))
{
if(org[j]>='A'&&org[j]<='Z') s[i].ch=org[j]-'A'+'a';
else s[i].ch=org[j];
s[i++].index=j;
}
}
len=i;
int maxv=0,left,right;
for(i=0;i<len;i++)
{
int v=0,a=i,b=i;
//偶数
for(int r=i,l=i-1;r>=0&&l>=0&&r<len&&l<len;r++,l--)
{
if(s[r].ch==s[l].ch) {v+=2;a=l;b=r;}
else break;
}
if(v>maxv) {maxv=v;right=b;left=a;}
//奇数
v=1,a=i,b=i;
for(int r=i+1,l=i-1;r>=0&&l>=0&&r<len&&l<len;r++,l--)
{
if(s[r].ch==s[l].ch) {v+=2;a=l;b=r;}
else break;
}
if(v>maxv) {maxv=v;right=b;left=a;}
}
printf("%d\n",maxv);
for(i=s[left].index;i<=s[right].index;i++) printf("%c",org[i]);
printf("\n");
return 0;
}
分享到:
相关推荐
《USACO中的Calf Flac》 USACO(美国计算机奥林匹克)是面向全球青少年的一项编程竞赛,旨在提升参赛者的算法设计与编程能力。在USACO的第一章中,我们经常会遇到各种有趣的题目,其中之一就是"Calf Flac"。这道...
小牛工作室装备Calf Studio Gear是LINUX操作系统下用于LV2和JACK环境的音频插件包。 该套件包含许多效果(延迟,调制,信号处理,滤波器,均衡器,动态效果,失真和母带效果),乐器(SF2播放器,风琴模拟器和单音...
"Prime Cryptarithm"结合了枚举和构造法,而"Calf Flac"则再次运用枚举。 1.4节探讨更多搜索技巧,如"Packing Rectangles"需要完全搜索,"The Clocks"可能需要用到BFS或DFS,或者数学方法。"Arithmetic ...
电化学和光谱法在中性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]。
- **搜索算法**:例如题目《Calf Flac》可以通过深度优先搜索或者广度优先搜索来解决。 2. **模拟算法**:这部分主要通过模拟实际场景来解决问题,例如题目《Greedy Gift Givers》和《Friday the Thirteenth》等,...
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的基本语法和编程模型,还能了解如何在实际项目中...
ERROR2:表示增益标定时的增益 mV 值 CALF ≤ 零点标定时的零点 mV 值 CAL0。 ERROR3:仪表最大量程 Fr 设置不合适,(Fr/Fd)或(Fr/Fd)>200000。 ERROR4:增益过低导致显示不稳定或者误差,或灵敏度过低。 ...
在示例中,我们看到如何将文件“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**:这是一组条件判断,分别检查年份、价格走势和日内涨跌...