zoukankan      html  css  js  c++  java
  • 【洛谷 4287】双倍回文

    题目描述

    记字符串ww的倒置为w^RwR。例如(abcd)^R=dcba(abcd)R=dcba,(abba)^R=abba(abba)R=abba。

    对字符串x,如果xx满足x^R=xxR=x,则称之为回文;例如abba是一个回文,而abed不是。

    如果x能够写成的ww^Rww^RwwRwwR形式,则称它是一个“双倍回文”。换句话说,若要xx是双倍回文,它的长度必须是44的倍数,而且xx,xx的前半部分,xx的后半部分都要是回文。例如abbaabbaabbaabba是一个双倍回文,而abaabaabaaba不是,因为它的长度不是4的倍数。

    xx的子串是指在xx中连续的一段字符所组成的字符串。例如bebe是abedabed的子串,而acac不是。

    xx的回文子串,就是指满足回文性质的xx的子串。

    xx的双倍回文子串,就是指满足双倍回文性质的xx的子串。

    你的任务是,对于给定的字符串,计算它的最长双倍回文子串的长度。

    输入格式

    输入分为两行。

    第一行为一个整数,表示字符串的长度。
    第二行有个连续的小写的英文字符,表示字符串的内容。

    输出格式

    输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出00。

    输入输出样例

    输入 #1
    16
    ggabaabaabaaball
    输出 #1
    12

    说明/提示

    N le 500000N500000

    其实今天考试题是这个(差不多啦)

    题解:emm菜鸡如我,附上40分暴力代码就溜。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<bits/stdc++.h>
    using namespace std;
    const int N=500010;
    int n,p[N],ans;
    int Yao_Chen_Lai_Le;
    char s[N];
    bool pd(int x,int len){
        int d=len/2;
        for(int i=x;i<=x+d-1;i++)
            if(s[i]!=s[i+d]) return 0;
        for(int i=x,j=x+d-1;i<=j;i++,j--)
            if(s[i]!=s[j]) return 0;
        return 1;
    }
    int work(){
        scanf("%s",s+1); 
        n=strlen(s+1);
        int p=(n/4)*4; 
        for(int l=p;l>=4;l-=4)
            for(int i=1;i+l-1<=n;i++)
                if(pd(i,l)==1) return l;
        return 0;
    }
    int main(){
        freopen("altar.in","r",stdin);
        freopen("altar.out","w",stdout);
        scanf("%d",&Yao_Chen_Lai_Le);
        while(Yao_Chen_Lai_Le--)
            printf("%d
    ",work());
        return 0;
    }
  • 相关阅读:
    js函数调用模式
    js闭包和回调
    js原型
    oracle sql优化笔记
    shell脚本学习
    程序与资源管理
    vi/vim学习
    压缩和解压缩
    用户及用户组
    万用字符和特殊字符
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11835127.html
Copyright © 2011-2022 走看看