【USACO】calfflac
关键:以回文中心位置为变量进行遍历
- //必须把纯字母先提出来 否则肯能会出现错误 比如: lvlv= 在检查长度4时 lvlv认为不是回文 vlv=认为是回文 但实际上 lvl 出现的要更早一些
- //判断回文的方法 可以输入字符串后 左右比较 或者分别正序 逆序 存储 判断是否相等
- //我的思路不对 严重超时了 我是以长度为变量进行循环 对于每个长度 每一个不同起始点的序列都需要对 整个序列重新判断一次是否为回文 O(n^3)
- //答案中 以中心字母为变量进行循环 只需要对每一个字母做为中心变量遍历一次, 每次的遍历长度小于等于总序列长度 通过不断更新存储最长回文找到最优解 O(n^2)
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- typedef struct
- {
- char c;
- int n;
- }AZ;
- int isch(char c)
- {
- return ((c <= 'z' && c >= 'a') || (c >= 'A' && c <= 'Z'));
- }
- int iscalfflac(AZ *c, int l, int r, int * loc) //输入字符 和 左右边界 判断是否为回文
- {
- int len = r - l + ;
- int ll, rr;
- int flag = ;
- int is = ; //判断是否进入过相等 防止纯符号
- while(l <= r)
- {
- if(c[l].c == c[r].c || c[l].c == c[r].c - 'A' + 'a' || c[r].c == c[l].c - 'A' + 'a')
- {
- l++; r--; is++;
- }
- else
- {
- flag = ;break;
- }
- }
- return (flag == ) ? : ;
- }
- int main()
- {
- FILE *in, *out;
- int loc[] = {,,,};
- int i = , j = , length;
- int r, l, rr, ll;
- char c[], c1[], c2[], c3[], c4[];
- AZ ch[];
- in = fopen("calfflac.in", "r");
- out = fopen("calfflac.out", "w");
- while(fscanf(in, "%c", &c[i]) != EOF)
- {
- if(isch(c[i]))
- {
- ch[j].c = c[i];
- ch[j].n = i;
- j++;
- }
- i++;
- }
- length = j; //总输入长度
- for(i = ; i < length; i++)
- {
- if(isupper(ch[i].c))
- {
- ch[i].c = ch[i].c - 'A' + 'a';
- }
- c1[i] = ch[i].c;
- c2[length - i - ] = ch[i].c;
- }
- for(i = length; i > ; i--) //这种方法在大输入时严重超时了
- {
- for(l = ; l <= length - i; l++ )
- {
- r = l + i - ;
- if(iscalfflac(ch, l, r, loc) == )
- {
- fprintf(out, "%d\n", i);
- for(j = ch[l].n ; j <= ch[r].n; j++)
- {
- fprintf(out, "%c", c[j]);
- }
- fprintf(out, "\n");
- return ;
- }
- }
- }
- fprintf(out, "%d\n", );
- return ;
- }
下面是答案的,注意做中心点时要对 奇数 偶数 考虑齐全
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include <ctype.h>
- char fulltext[];
- char text[];
- 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+;
- 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=, p=fulltext; *p; p++)
- if(isalpha(*p))
- if(i++ == n)
- break;
- assert(*p != '\0');
- /* print out the next pallen characters */
- for(i=; i<pallen && *p; p++) {
- fputc(*p, fout);
- if(isalpha(*p))
- i++;
- }
- fprintf(fout, "\n");
- exit();
- }
【USACO】calfflac的更多相关文章
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- 1642: 【USACO】Payback(还债)
1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...
- 1519: 【USACO】超级书架
1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...
- Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers
[USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...
- 【CPLUSOJ】【USACO】【差分约束】排队(layout)
[题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...
- 【USACO】Dining
[题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...
- 【USACO】Optimal Milking
题目链接 : [POJ]点击打开链接 [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...
- 【USACO】 Balanced Photo
[题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...
- 【USACO】 Balanced Lineup
[题目链接] 点击打开链接 [算法] 这是一道经典的最值查询(RMQ)问题. 我们首先想到线段树.但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解. 稀疏表算法.其实也是一种动态 ...
随机推荐
- POJ1995 Raising Modulo Numbers
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6373 Accepted: ...
- 初次使用erlang的concurrent
如果不是它骇人听闻的并行性能,几乎不会考虑去学习这么一门语言.因为它的并行,我看到的是一块用软件写出来的电路板,是的,它几乎就是把电脑变成了一个可以自由编写逻辑的芯片. 例程来自这里:http://w ...
- slf4j和log4j配置
SLF4J即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J是一个用于日志系统的简单Fac ...
- C语言学习-01第一个C语言程序
一 C语言的历史 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供 ...
- JavaScript 上万关键字瞬间匹配——借助Hash表快速匹配
来源: http://www.cnblogs.com/index-html/archive/2013/04/17/js_keyword_match.html http://www.etherdream ...
- Practical Machine Learning For The Uninitiated
Practical Machine Learning For The Uninitiated Last fall when I took on ShippingEasy's machine learn ...
- Unable to open liblaunch_sim.dylib. Try reinstalling Xcode or the simulator
关于Xcode7 Beta报错 simulator runtime is not available. Unable to open liblaunch_sim.dylib Try reinstall ...
- Unity 游戏资源ktx转换png
Unity 开发的模型贴图都是.ktx格式的,提取出来的资源,其中的ktx资源,用PVRTexToolGUI.exe可以打开查看,可以发现都是上下颠倒,且被拉伸 直接转为png格式的批处理脚本为: @ ...
- 锋利的jQuery-2--一个显示和隐藏的例子,主要看写法
例子:如图,默认不显示全部,点击按钮来回切换,全部显示是一部分推荐的品牌高亮. $(function(){ //dom加载完再执行 var category = $('ul li:gt(5):not( ...
- delphi基本语法
本文参考自<delphi2010语法手册> 1. 工程文件结构 源文件联系着unit单元,delphi主模块源文件格式为.dpr,其他模块为.pas,一个完整程序由一个.dpr和若干.pa ...