湖大 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 ...
随机推荐
- schtasks确实可以绕过UAC,简直不可思议啊~~
https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx
- wordpress自定义栏目
开启自定义栏目:点击头顶的“显示选项”,勾选“自定义栏目” 然后编辑文章时,即可看见 实验: 定义名称为:play_url ,值为:http://www.xiami.com/widget/635357 ...
- [iOS]集成环信SDK然后运行时候crash了-[NSBundle initWithURL:]: nil URL argument'
Crash的reason是-[NSBundle initWithURL:]: nil URL argument' 1.首先我是用cocoapods导入的环信的SDK.然后怎么运行怎么crash. 2. ...
- [iOS]iPhone推送原理
推送原理,先上图 说一下原理吧, 由App向iOS设备发送一个注册通知 iOS向APNs远程推送服务器发送App的Bundle Id和设备的UDID APNs根据设备的UDID和App的Bundle ...
- Linux命令-sudo
sudo命令用于给普通用户提供额外权利来完成原本只有超级用户才有权限完成的任务, 格式:sudo [参数] 命令名称 sudo命令与su命令的区别是,su命令允许普通用户完全变更为超级管理员的身份,但 ...
- openstack配置注意事项(主要是网络相关)
vlan协议应该配置为802.1q,另一个容易混淆的为ISL,配置命令为 switchport trunk encapsulation dot1q /islswitchport mode trunk ...
- C# 读取指定URL的内容
#region 读取指定URL的内容 /// <summary> /// 读取指定URL的内容 /// </summary> /// <param name=" ...
- poj - 1258 Agri-Net (最小生成树)
http://poj.org/problem?id=1258 FJ为了竞选市长,承诺为这个地区的所有农场联网,为了减少花费,希望所需光纤越少越好,给定每两个农场的花费,求出最小花费. 最小生成树. # ...
- Unix/Linux 关机命令
关机命令 AIX shutdown now Solaris init 5 Redhat shutdown now Centos shutdown now
- [HDOJ1171]Big Event in HDU(01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171 许多有价值的物品,有重复.问如何将他们分成两堆,使两堆价值之差最小. 对价值求和,转换成01背包 ...