算法竞赛入门经典 例题 3-4 回文串

输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同。如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符串长度不超过5000,且占据单独的一行。应该输出最长的回文串,如果有多个,输出起始位置最靠左的。

样例输入:Confuciuss say:Madam,I‘m Adam.

样例输出:Madam,I‘m Adam

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXN 5000 + 10
char buf[MAXN], s[MAXN];//int
int p[MAXN];

int main(int argc, char *argv[])
{
  int n, m = 0, i, j, x, y;//m = 0
  fgets(buf, sizeof(s), stdin);
  int max = 0;//max = 0;
  n = strlen(buf);
  for(i = 0; i < n; i++)
  {
     if(isalpha(buf[i])) { s[m] = toupper(buf[i]);  p[m++] = i; }

  }
  for(i = 0; i < m; i++)
  {
     for(j = 0; i-j>=0 && i+j<m; j++)//i+j+1
     {
       if(s[i-j] != s[i+j]) break;
       if(2*j+1 > max) { max = 2*j+1; x = p[i-j]; y = p[i+j];}//;
     }
     for(j = 0; i-j>=0 && i+j+1<m; j++)//2*j+2
     {
        if(s[i-j] != s[i+j+1]) break;
        if(2*j+2 > max) { max = 2*j+2; x = p[i-j]; y = p[i+j+1];}//
     }
  }
  for(i = x; i <= y; i++)
  {
     printf("%c", buf[i]); //%c
  }
  printf("\n");//最后要加换行符
  system("PAUSE");
  return 0;
}

总结:1  对字符串预处理

2  ctype.h  或 c -‘a‘+‘A‘

3 两种情况abc 或 abbc

4 fgets 最多MAXN-1个字符,倒数第二个是‘\n‘,最后一个是‘\0‘

5 不推荐使用gets,存在缓冲区溢出漏洞

时间: 2024-10-03 22:37:29

算法竞赛入门经典 例题 3-4 回文串的相关文章

算法竞赛入门经典--例题和课后训练(动态规划)

1.地铁间谍(逆序推导时间法) 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的.所以,她决定尽可能地呆在运行的列车中,她只能往前或往后坐车. 玛利亚为了能准时且安全的到达最后一个车站与对方碰头,需要知道在在车站最小等待时间总和的计划.

算法竞赛入门经典 例题 3-1 开灯问题

有n盏灯,编号为1-n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,       开着灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着? 输入:n和k,输出开着的灯编号.k≤n≤1000. 样例输入:7  3 样例输出:1 5 6 7 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MA

算法竞赛入门经典 例题 3-2 蛇形填数

在n*n方阵里填入1,2,?,n*n,要求填成蛇形.例如n=4时方阵为 10    11   12   1 9    16   13   2 8    15   14   3 7     6     5    4 上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n≤8. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 10 int a[MAXN][MAXN]; i

《算法竞赛入门经典》动态规划复习

codevs 4979 数塔 1 #define N 100 2 #include<iostream> 3 using namespace std; 4 #include<cstdio> 5 int a[N][N],b[N][N],n; 6 int main() 7 { 8 scanf("%d",&n); 9 for(int i=1;i<=n;++i) 10 for(int j=1;j<=i;++j) 11 { 12 scanf("

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

《算法竞赛入门经典第二版》 P35 习题2-4 子序列的和(subsequence)

/* <算法竞赛入门经典第二版> P35 习题2-4: 输入两个正整数 n < m < 10^6,输出 (1/n)^2 + 1/(n+1)^2 +……+ 1/m^2,保留5位小数. 输入包含多组数据,结束标志为 m=n=0. 有错欢迎指出^_^ */ #include<stdio.h> int main() { int m,n,i,j=1; while(scanf("%d%d",&m,&n) != EOF) { double sum

算法竞赛入门经典_4.3_递归

看代码 #include <stdio.h> int f(int n){ return n == 0?1:f(n-1)*n; } int main() { printf("%d\n", f(5)); return 0; } 上面f函数使用了递归,递归由两部分组成,一是递归头,二是递归体. 我们使用gcc调试工具 H:\编程书籍学习\算法竞赛入门经典2代码\算法入门经典第四章>b f 'b' 不是内部或外部命令,也不是可运行的程序 或批处理文件. H:\编程书籍学习\算

算法竞赛入门经典训练指南

最近在看算法竞赛入门经典训练指南这本书,书中不错的算法我将在博客中发布,和大家共同学习. 题目: 在你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个能力值为m的骑士可以砍掉一个直径不超过x的头,且需要支付x个金币.如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次). 输入格式: 输入包含多组数据.每组数据的第一行为正整数m和n(1<=m,n<=20 000):以下m行每行为一个整数,即恶龙每

算法竞赛入门经典-训练指南(10881-Piotr&#39;s Ants)

题目大意: 一根长度为L的木棍一堆蚂蚁爬,向左或向右,速度都为1,若两蚂蚁碰撞则同时转头(转身时间忽略不计),问T时间之后每只蚂蚁的位置: 输入:t,(t个样例),每个样例输入 L,T,n,接下来是n行每行两个数据,一个POS(位置),一个dir(方向): 输出:按输入顺序输出每只蚂蚁的最终位置,若处于碰撞状态则输出Turning,掉下去输出"Fell off": 解题思路: 本题类似于<挑战程序设计>的一道水题(POJ -1852  Ants),思路题:不过本题输入并不一