字符串模拟赛T2
2016-07-20 19:25
288 查看
// source code from laekov for c0x17 #define PRID "fkqh" #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 200009; int n, l[maxn], q[maxn], vx[maxn], vy[maxn]; char a[maxn]; void manacher() { l[0] = 1; for (int i = 1, j = 0; i < (n << 1) - 1; ++ i) { int r = ((j + 1) >> 1) + l[j] - 1; int p = i >> 1, q = i - p; l[i] = (r >= q) ? min(r - q + 1, l[(j << 1) - i]) : 0; while (p - l[i] >= 0 && q + l[i] < n && a[p - l[i]] == a[q + l[i]]) ++ l[i]; if (q + l[i] - 1 > r) j = i; } } #define getLeft(x) (((x)>>1)-l[x]+1) #define getRight(x) ((((x)+1)>>1)+l[x]-1) void dp(bool d) { static int q[maxn]; int hd = 0, tl = 0; if (!d) { for (int i = 0; i < n; ++ i) { if (!tl || getRight(i << 1) > getRight(q[tl - 1])) q[tl ++] = (i << 1); while (getRight(q[hd]) < i) ++ hd; vx[i] = (i << 1) - q[hd] + 1; if (i < n - 1 && getRight((i << 1) + 1) > getRight(q[tl - 1])) q[tl ++] = (i << 1) + 1; } } else { for (int i = n - 1; i >= 0; -- i) { if (!tl || getLeft(i << 1) < getLeft(q[tl - 1])) q[tl ++] = (i << 1); while (getLeft(q[hd]) > i) ++ hd; vy[i] = q[hd] - (i << 1) + 1; if (i && getLeft((i << 1) -1) < getLeft(q[tl - 1])) q[tl ++] = (i << 1) - 1; } } } int main(int argc, char* args[]) { if (argc < 2 || strcmp(args[1], "-nf")) { freopen(PRID ".in", "r", stdin); freopen(PRID ".out", "w", stdout); } scanf("%s", a); n = strlen(a); manacher(); dp(0); dp(1); int ans = 2; for (int i = 1; i < n; ++ i) ans = max(ans, vx[i - 1] + vy[i]); printf("%d\n", ans); }
相关文章推荐
- 服务器端用Servlet响应客户端请求,Gson请求。可以返回多个数据库中的信息
- Viusal C++6.0与Hugin Lite8.0联合编程构建贝叶斯网络推理机
- Service的使用(一)
- 最小生成树(vector)用法
- restful--spring
- Climbing Stairs
- 游戏界面的跳转
- java快速排序实现
- 微信运营:自媒体人必须知道的20个自媒体平台
- Replace RedHat 6.6`s yum with CentOS`s yum
- input 只能输入数字
- Android面试题集锦(一)
- NKOI 3720(UVA 11825)黑客的攻击
- 素数判定
- sequelize(一)
- 【git】git常用命令的学习与总结
- android---重写textview实现跑马灯
- POJ 1852 Ants 【水+Trick+贪心】
- Markdown 编辑器语法指南
- 字符串模拟赛T1