[ CODEVS ][ MANACHER回文 ] 1568 奶牛回文

裸Manacher算法题,开一个rank[i]记录映射关系。

 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<iterator>
const int maxn = 20000 + 10;
using namespace std;
char s[maxn], in[maxn];
int rank[maxn], p[maxn], id, mx;
bool check(char t) {
	if(t >= 'a'&& t <='z'||t >= 'A'&&t <= 'Z') return true;
	else return false;
}
int main() {
	string src, dst;
	for(int i = 0; ; i++) {
		scanf("%c", &in[i]);
		if(in[i] == EOF) break;
	}
	src = in;
	transform(src.begin(), src.end(), back_inserter(dst), ::toupper);
    transform(src.begin(), src.end(), dst.begin(), ::tolower);
    int len = 0;
    for(int i = 0; i < dst.length(); i++) {
		if(check(dst[i])) { s[len] = dst[i]; rank[len] = i; len++;}
	}
	len *= 2;
	for(int i = len; i >= 0; i--) { 
		if(i & 1) s[i] = s[i / 2];
		else s[i] = '#';
	}
	int pmax = 0;
	for(int i = 0; i <= len; i++) {
		if(i >= mx) p[i] = 1;
		else p[i] = min(mx - i + 1, p[2 * id - i]);
		while(i - p[i] >= 0 && i + p[i] <= len && s[i + p[i]] == s[i - p[i]]) p[i]++;
		if(i + p[i] - 1 >= mx) {
			mx = i + p[i] - 1;
			id = i;
		}
		pmax = max(pmax, p[i]);
	}
	int k;
	for(k = 0; k < len; k++) {
		if(p[k] == pmax) break; 
	}
	int l = k - (p[k] - 1); int r = k + (p[k] - 1); r--;
	l /= 2, r /= 2;
	l = rank[l];
	r = rank[r];
	cout << pmax - 1 << endl;
	for(int i = l; i <= r; i++) cout << src[i];
	return 0;
}

  

转载于:https://www.cnblogs.com/Kvar-ispw17/p/6574827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值