关键:以回文中心位置为变量进行遍历

//必须把纯字母先提出来 否则肯能会出现错误 比如: 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的更多相关文章

  1. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  2. 1642: 【USACO】Payback(还债)

    1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...

  3. 1519: 【USACO】超级书架

    1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...

  4. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers

    [USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...

  5. 【CPLUSOJ】【USACO】【差分约束】排队(layout)

    [题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...

  6. 【USACO】Dining

    [题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...

  7. 【USACO】Optimal Milking

    题目链接 :        [POJ]点击打开链接        [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...

  8. 【USACO】 Balanced Photo

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...

  9. 【USACO】 Balanced Lineup

    [题目链接] 点击打开链接 [算法] 这是一道经典的最值查询(RMQ)问题. 我们首先想到线段树.但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解. 稀疏表算法.其实也是一种动态 ...

随机推荐

  1. 用WinRAR进行安装包的制作

    简单的绿色的安装包制作工具,如果不想用复杂且庞大的vs提供的制作工具,或许这个绿色解压安装包是个不错的选择. 下面我收集了一些制作的教程(百度经验的文章)和一些常用到的命令行: WinRAR自解压安装 ...

  2. IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    这个错误的定位:你的站点使用了Forms验证,而且在部署在生产环境的时候,设置错误,或者注释了. 解决方法如下: 1.检查Forms配置是否屏蔽. 2.有权限访问的资源是否已经开发. 基本就围绕以上两 ...

  3. MySql与Java的时间类型

    MySql的时间类型有          Java中与之对应的时间类型date                                           java.sql.DateDatet ...

  4. ExtJS入门教程04,这是一个超级好用的grid

    今天进行extjs入门教程的第四篇:grid. 来一份grid尝尝 小伙伴们都知道extjs的grid功能强大,更清楚功能强大的东西用起来必然会复杂.今天我们就从最简单的grid开始讲解. 先来一个最 ...

  5. Servlet------(声明式)异常处理

    Test.java 其他方法不变,重写 protected void service()方法 public void init(ServletConfig config) throws Servlet ...

  6. 用过SQL语句获取织梦DedeCMS每个栏目各有多少文章

    我对SQL语句不是很精通,这个SQL调用语句是我在一个模板里面看到了,特来和大家分享,大家在制作模板的过程中有需要可以用得到.       显示效果: 共有会员:31 名       本月更新:39 ...

  7. 织梦DedeCms去掉栏目页面包屑导航最后的分隔符“>”

    织梦DedeCms的面包屑导航调用标签{dede:field name=’position’ /},在栏目页里调用的面包屑导航,最后会出现分割符号“>”,如:主页 > DedeCms 模板 ...

  8. WEB移动应用框架构想(转载)

    iUI.jQTouch.WPTouch.PhoneGap.XUI.iWebkit.Rhodes.gwt-mobile…当我们已经开始惊 叹 web移动应用充斥着各种各样框架与类库的时候,其实各大web ...

  9. JAVA如何调用C/C++方法

    JAVA如何调用C/C++方法 2013-05-27 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决JAVA对本地操作的 ...

  10. SSN 社会安全号码

    SSN是 Social Security Number 的缩写,译为「社会安全号码」,为美国社会安全卡(Social Security Card)上的 9 位数字.SSN 原本目的是用于追踪个人的纳税 ...