湖大 11404 manacher
链接 http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11404&courseid=0
求 最长回文个数 并且输出 ; 虽然 O(n^2) 可过; 但 O(n) 是王道
看这个博客 http://www.cnblogs.com/wulangzhou/p/3449428.html
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 111000
using namespace std;
inline int min( int a,int b ){return a>b?b:a;}
inline int max( int a,int b ){return a>b?a:b;}
char cha[maxn],str[maxn*]; int pi[maxn*];
struct date{
int l,r,len;
bool operator <(const date &a)const{
if( a.len != len )return a.len < len;
else return a.r < r;
}
}node[];
void manacher( )
{
int len = strlen( str ); int mx = ; int id = ;
memset( pi,,sizeof(pi) );
for( int i = ; i < len; i++ )
{
if( mx > i )pi[i] = min( pi[id*-i],mx-i );
else pi[i] = ;
while( str[i-pi[i]] == str[i+pi[i]] )pi[i]++;
node[i].l = i-(pi[i]-); node[i].r = i+(pi[i]-); node[i].len = node[i].r - node[i].l + ;
if( i+pi[i] > mx )
{
mx = i+pi[i];
id = i;
}
}
}
int main( )
{
int T,cas = ; scanf("%d",&T);
while( T-- )
{
scanf("%s",&cha); int len = strlen( cha ); int k = ; str[k++] = '!';
for( int i = ; i < len; i++ )
str[k++] = '#',str[k++] = cha[i]; str[k++] = '#'; str[k] = '\0';
manacher( );
printf("Case #%d:\n",cas++);
sort( node,node+k ); len = node[].len;
if( len <= ){continue;}
for( int i = ; i < k; i++ )
if( node[i].len == len )
{
for( int j = node[i].l; j <= node[i].r; j++ )
if( str[j] != '#' )cout<<str[j];
cout<<endl;
}else break;
}
return ;
}
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; char str[2100],cha[2100];
int tab[2100];
void manacher( )
{
int Mx = 0; int id = 0; int len = strlen(cha);
memset(tab,0,sizeof(tab));
for( int i = 1; i < len; i++ )
{
if( i < Mx )
tab[i] = min( tab[id*2-i],Mx-i );
else tab[i] = 1;
while( cha[i+tab[i]] == cha[i-tab[i]] )tab[i]++;
tab[i]--;
if( Mx < i+tab[i] ){
Mx = i+tab[i];
id = i;
}
}
}
int main( )
{
int T,cas = 1; cin>>T;
while( T-- )
{
scanf("%s",&str); int len = strlen(str); int k = 0;
cha[k++] = '@';
for( int i = 0; i < len; i++ )
{cha[k++] = '#', cha[k++] = str[i];}
cha[k++] = '#'; cha[k] = '\0';
int Max = 0; manacher( ); printf("Case #%d:\n",cas++);
for( int i = 1; i < k; i++ )
if( cha[i] != '#' )Max = max( Max,(tab[i]/2)*2+1 );
else Max = max( Max,tab[i] );
if( Max <= 1 ){continue;}
for( int j = k-1; j >= 0; j-- )
{
if( (cha[j] == '#'&&tab[j]==Max) || (cha[j] != '#'&&(tab[j]/2)*2+1 == Max ) )
for( int i = j-tab[j]; i != j+tab[j]; i++ )
if( cha[i] != '#' )cout<<cha[i];
cout<<endl;
}
}
return 0;
}
/*
abacaba
*/
湖大 11404 manacher的更多相关文章
- 湖大OJ-实验E----可判定的DFA的空问题
实验E----可判定的DFA的空问题 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit ...
- 湖大OJ-实验C----NFA转换为DFA
实验C----NFA转换为DFA Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit us ...
- ACM/ICPC 之 数论-费马大定理(HNUOJ 13371)
好歹我是数学专业的学生,还是要写写训练的时候遇到的数学问题滴~~ 在ACM集训的时候在各高校OJ上也遇见过挺多的数学问题,例如大数的处理,素数的各种算法,几何问题,函数问题(单调,周期等性质),甚至是 ...
- 【转】赞一下huicpc035
以下转自:http://hi.baidu.com/fpkelejggfbfimd/item/99421eaefa93a814a9cfb722 本来以为HNU的huicpc035和我一样退役了,后来听说 ...
- 【转】ACM/ICPC生涯总结暨退役宣言—alpc55
转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写 ...
- 一位ACM过来人的心得(转)
励志下! 刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解.很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条 ...
- 一位ACM过来人的心得
刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解. 很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条件. 我 ...
- 关于ACM,关于CSU
原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...
- 【转】 如何提高自己的acm个人能力
2011-05-17 21:26 1429人阅读 评论(0) 收藏 举报 算法网络blog八卦游戏读书 转载自 简单de数字 最终编辑 fading_code by zfy0701 本来以为HNU ...
随机推荐
- JavaScript基础之函数与数组
函数 函数的基本概念 为完成某一功能的程序指令(语句)的集合,称为函数.有的程序员把函数称为方法,希望大家不要被这两个名词搞晕了. 函数分为:自定义函数.系统函数(经常查看js帮助手册). j ...
- Grub命令行
今天电脑无缘无故无法正常启动,只提示 GRUB> 看来是GRUB引导出问题了,要解决下. 先 想到用制作U盘启动盘来启动,参照网上的方法,很简单用USBBOOT软件做了一个U盘启动盘,按F11在 ...
- Centos环境下部署游戏服务器-编译
游戏服务器是在windows环境开发的,相关跨平台的东西在这里不谈了,只谈如何将Visual Studio 工程转换到Linux下编译.这里涉及到的软件分别为:Centos版本为6.4,Visual ...
- CentOS软件安装目录查找
注:一般的软件的默认安装目录在/usr/local或者/opt里,可以到那里去找找. 指令名称:whereis 功能介绍:在特定目录中查找符合条件的文件.这些文件的烈性应属于原始代码,二进制文件,或是 ...
- Scala模式匹配和类型系统
1.模式匹配比java中的switch case强大很多,除了值,类型,集合等进行匹配,最常见的Case class进行匹配,Master.scala有大量的模式匹配. Case "_&qu ...
- JSP页面的构成
JSP页面就是带有JSP元素的常规Web页面,它由静态内容和动态内容构成.其中,静态内容指HTML元素,动态内容(JSP元素)包括指令元素.脚本元素.动作元素.注释等内容. 1.指令元素 指令 ...
- Echarts - js-20160611
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- C# 字符流打印类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- Java 全角字符转半角字符
1.java代码里有时候会遇到代码注入的安全问题,为了防止这种问题,增加了一个过滤功能.主要是过滤全角字符,把url不能识别的全角字符转换成半角字符 public class Test { publi ...
- 《c程序设计语言》读书笔记--闰年和字符输入不用 && ||
#include <stdio.h> #include <string.h> #define sta 1500 #define Num 1600 int main() { in ...