zoukankan      html  css  js  c++  java
  • 回文检测 [USACO Training Section 1.3]

    题目描述

    据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。

    在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母’A’-‘Z’和’a’-‘z’。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。
    输入输出格式
    输入格式:

    输入文件不会超过20,000字符。这个文件可能一行或多行,但是每行都不超过80个字符(不包括最后的换行符)。

    输出格式:

    输出的第一行应该包括找到的最长的回文的长度。

    下一行或几行应该包括这个回文的原文(没有除去标点符号、空格),把这个回文输出到一行或多行(如果回文中包括换行符)。

    如果有多个回文长度都等于最大值,输出最前面出现的那一个。

    输入样例#1:
    Confucius say: Madam, I’m Adam.

    输出样例#1:
    11
    Madam, I’m Adam

    #include <cstdio>   
    #include <cctype>
    #include <algorithm>
    #include <iostream>
    #define N 20005
    using namespace std;
    int at[N],i,n=0,l=0,able(int o),maxn=0,ls,t;
    char k[N]={0},m[N]={0};//k为原字符串,m为新字符串
    int able(int o)//计算回文串长度
    {    
        int i,j,a1=1,a2=0;
        for(i=o,j=1 ;i-j>=0&&i+j<l&&m[i-j]==m[i+j] ; j++)//取中间一个,奇数长度回文
        //从o+-1开始扩散 不超过字符串范围 符合回文数 
            a1+=2;
        for(i=o,j=0 ; i-j>=0&&i+j+1<l&&m[i-j]==m[i+j+1] ; j++)//取中间2个,偶数长度回文
        //从o,+1始 开始扩散 不超过字符串范围 符合回文数 
            a2+=2;
        return max(a1,a2);//取最大值
    }
    int main(){
        while((k[n]=getchar())!=EOF)n++;//读取文章
        for(i=0;i<n;i++)
            if(isalpha(k[i]))
        {
            m[l]=tolower(k[i]);//转化为小写更好比较
            at[l++]=i;//at保存新字符串向原字符串的映射位置
        }
        for(i=0;i<l;i++)
        {
            t=able(i);
            if(t>maxn){maxn=t;ls=i;}//保存回文最后位置
        }
        int front,back;
        if(maxn&1)
        {
            front=ls-maxn/2;
            back=ls+maxn/2;
        }
        else
        {
            front=ls-maxn/2+1;
            back=ls+maxn/2;
        }
        printf("%d
    ",maxn);
        int fr=at[front],ba=at[back];
        for(int i=fr;i<=ba;i++)
            putchar(k[i]);
        return 0;
    }
  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/ibilllee/p/7651978.html
Copyright © 2011-2022 走看看