模板,但是对这个算法还是不太清楚,真实不明觉厉....

 #include <iostream>
#include <cstdio>
#include <string.h>
#pragma warning ( disable : 4996 )
using namespace std; inline int Max(int a,int b) { return a>b?a:b; }
inline int Min(int a,int b) { return a>b?b:a; }
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+1e4+; char str[maxn];
char nstr[maxn<<];
int maxlen[maxn<<];
int len, plen, ans; void init()
{
memset( nstr, , sizeof(nstr) );
memset( maxlen, , sizeof(maxlen) );
len = strlen(str);
nstr[] = '$'; nstr[] = '#'; int j = ;
for ( int i = ; i < len; i++ )
{
nstr[j++] = str[i];
nstr[j++] = '#';
}
nstr[j] = '\0';
plen = j;
} void solve()
{
ans = -;
int id, mx = ; for ( int i = ; i < plen; i++ )
{
if( i < mx )
maxlen[i] = Min( maxlen[*id-i], mx-i );
else
maxlen[i] = ; while( nstr[i-maxlen[i]] == nstr[i+maxlen[i]] )
maxlen[i]++; if ( mx < i + maxlen[i] )
{
id = i;
mx = i + maxlen[i];
}
ans = Max(ans, maxlen[i]-);
}
} int main()
{
while ( ~scanf("%s", str) )
{
init();
solve();
printf( "%d\n", ans );
}
return ;
}

又做了一道几乎模板的题(吉哥系列故事——完美队形II),终于对马拉车有点理解了,这算法实在太巧妙了!

和模板几乎一样,只不过增多了个左半边要升序排列罢了

 #include <iostream>
#include <cstdio>
#include <string.h>
#pragma warning ( disable : 4996 )
using namespace std; inline int Max(int a,int b) { return a>b?a:b; }
inline int Min(int a,int b) { return a>b?b:a; }
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+; int maxl[maxn<<];
int str[maxn], nstr[maxn<<];
int N, ans, plen; void init()
{
memset( maxl, , sizeof(maxl) );
memset( nstr, , sizeof(nstr) );
nstr[] = ; nstr[] = -; int j = ;
for( int i = ; i < N; i++ )
{ nstr[j++] = str[i]; nstr[j++] = -; }
nstr[j] = -;
plen = j;
} void solve()
{
ans = -;
int id, mx = ;
for ( int i = ; i < plen; i++ )
{
if(i < mx)
maxl[i] = Min(maxl[*id-i], mx-i);
else
maxl[i] = ; while( nstr[i-maxl[i]]==nstr[i+maxl[i]] && nstr[i-maxl[i]]<=nstr[i-maxl[i]+] )
maxl[i]++;
if(mx < i + maxl[i])
{ id = i; mx = i + maxl[i]; } ans = Max(ans, maxl[i]-);
}
} int main()
{
int all; cin >> all;
while (all--)
{
cin >> N;
for( int i = ; i < N; i++ )
scanf( "%d", &str[i] );
init();
solve(); printf( "%d\n", ans );
}
return ;
}

最新文章

  1. MySQL学习笔记八:日期/时间的处理
  2. 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法
  3. 数据存储_ SQLite (1)
  4. Redis配置文件参数说明
  5. ASP.NET简单验证码
  6. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
  7. Linux 查看CPU,内存,硬盘 !转
  8. java学习日志(1):命令行and小程序
  9. C++学习之const整理总结
  10. Setfocus - IE 需要使用setTimeout
  11. android使用adb installapk出现can&#39;t find **.apk to install
  12. 简单竖向Tab选项卡
  13. php简单对象与数组的转换
  14. 注意,WebDeploy服务会占用80端口。(Windows关闭了IIS,80端口任然被占用)
  15. Android设置对话框去除黑边
  16. 如何用Linux外接显示器或投影仪
  17. Spring AOP: 织入的顺序
  18. useful tips for python
  19. Python_Cxfreeze打包exe
  20. C#中结构(struct)的部分初始化和完全初始化

热门文章

  1. Django的日常-AJAX
  2. printk函数速率限制
  3. JS规则 确定你的存在(变量声明) 声明变量语法: var 变量名; 一次声明多个,中间用逗号隔开var num1,mun2 ;
  4. Struts2基本总结
  5. [转]Entity Framework教程(第二版)
  6. MyEclipse使用总结——在MyEclipse中新建Maven框架的web项目[转]
  7. 表单修饰符.lazy.number.trim
  8. PAT甲级——A1092 To Buy or Not to Buy【20】
  9. 《DSP using MATLAB》Problem 8.11
  10. VRRP概述-转