【manacher算法】POJ 3974 Palindrome

题目链接:http://poj.org/problem?id=3974



题目大意:给定字符串S,求出最长的回文字串长度


用manacher算法可以在O(n)的复杂度求出回文字串长度


manacher算法详解:http://blog.youkuaiyun.com/xingyeyongheng/article/details/9310555


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 1000100

int p[N*2+1];//以i为中心的(包含i这个字符)回文串半径长
char s[N*2+1];

void init(char *s,int len){
	int i;
	//在每个相邻的字符之间插入一个分隔符,把奇数长度回文串与偶数长度回文串统一考虑
	for(i=len;i>=0;--i){
		s[i+i+2]=s[i];
		s[i+i+1]='#';
	}
	//插入了len+1个'#',最终的s长度是1~len+len+1即2*len+1,首尾s[0]和s[2*len+2]要插入不同的字符
	s[0]='*';//s[0]='*',s[len+len+2]='\0',防止在while时p[i]越界

	//aba->*#a#b#a#\0
	
}

int manacher(char *s,int len){
	int i;
	int maxlen=0,id=0;
	for(i=1;i<2*len+1;++i){
		if(p[id]+id>i)
			p[i]=min(p[id-(i-id)],id+p[id]-i);
		else
			p[i]=1;

		while(s[i-p[i]]==s[i+p[i]]) p[i]++;

		if(id+p[id]<i+p[i])
			id=i;
		maxlen=max(maxlen,p[i]);
	}
	return maxlen-1;
	//aba->*#a#b#a#\0
	//maxlen=p[4]=4;
}

int main(){
	int cas=1;
	while(scanf("%s",&s)!=EOF&&s[0]!='E'){
		int len=strlen(s);
		int ans=0;
		init(s,len);
		ans=manacher(s,len);
		printf("Case %d: %d\n",cas++,ans);
	}
	return 0;
}


基于html+python+Apriori 算法、SVD(奇异值分解)的电影推荐算法+源码+项目文档+算法解析+数据集,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 电影推荐算法:Apriori 算法、SVD(奇异值分解)推荐算法 电影、用户可视化 电影、用户管理 数据统计 SVD 推荐 根据电影打分进行推荐 使用 svd 模型计算用户对未评分的电影打分,返回前 n 个打分最高的电影作为推荐结果 n = 30 for now 使用相似电影进行推荐 根据用户最喜欢的前 K 部电影,分别计算这 K 部电影的相似电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now 根据相似用户进行推荐 获取相似用户 K 个,分别取这 K 个用户的最喜爱电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now Redis 使用 Redis 做页面访问次数统计 缓存相似电影 在使用相似电影推荐的方式时,每次请求大概需要 6.6s(需要遍历计算与所有电影的相似度)。 将相似电影存储至 redis 中(仅存储 movie_id,拿到 movie_id 后还是从 mysql 中获取电影详细信息), 时间缩短至:93ms。 十部电影,每部存 top 5 similar movie 登录了 1-6 user并使用了推荐系统,redis 中新增了 50 部电影的 similar movie,也就是说,系统只为 6 为用户计算了共 60 部电影的相似度,其中就有10 部重复电影。 热点电影重复度还是比较高的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值