Manacher算法 求最長迴文子串 ACM模板

Manacher

求最長迴文子串

ACM模板

C++

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 100000 + 10;
char Ma[MAXN << 1];
int Mp[MAXN << 1];
 
void Manacher(char s[], int len)
{
	int l = 0;
	Ma[l ++] = '$';
	Ma[l ++] = '#';
	for(int i = 0; i < len; i ++)
	{
		Ma[l ++] = s[i];
		Ma[l ++] = '#';
	}
	Ma[l] = 0;
	int mx = 0, id = 0;
	for(int i = 1; i < l; i ++)
	{
		Mp[i] = mx > i ? min(Mp[2 * id - i], mx - i) : 1;
		while(Ma[i + Mp[i]] == Ma[i - Mp[i]]) Mp[i] ++;
		if(i + Mp[i] > mx)
		{
			mx = i + Mp[i];
			id = i;	
		}
	}	
}

char s[MAXN];

int main()
{
	while(scanf("%s", s) != EOF)
	{
		int len = strlen(s);
		Manacher(s, len);
		int ans = 0;
		for(int i = 0; i < 2 * len + 2; i ++)
			ans = max(ans, Mp[i] - 1);
		printf("%d\n", ans);
	}
	return 0;
}

Java

	static int MAXN = 100000 + 10;
	public static void main(String args[]) throws IOException
	{
		InputStream inputStream = System.in;
		OutputStream outputStream = System.out;
		InputReader in = new InputReader(inputStream);
		PrintWriter out = new PrintWriter(outputStream);
		Task solver = new Task();
		solver.solve(in, out);
		out.close();
	}
	
	static class Task{
		public void solve(InputReader in, PrintWriter out) throws IOException{
			while(in.hasNext()){
				String s = in.next();
				Manacher(s);
				int ans = 0;
				for(int i = 0; i < 2 * s.length() + 2; i ++)
					ans = Math.max(ans, Mp[i] - 1);
				out.println(ans);
		}
	}
}
	
	static int Mp[] = new int [MAXN << 1];
	static char Ma[];
	public static void Manacher(String s){
		char a[] = s.toCharArray();
		StringBuilder tmp = new StringBuilder();
		tmp.append("@");
		tmp.append("$");
		for(int i = 0; i < a.length; i ++){
			tmp.append(a[i]);
			tmp.append("$");
		}
		Ma = tmp.toString().toCharArray();
		int mx = 0, id = 0;
		for(int i = 0; i < Ma.length; i ++){
			Mp[i] = mx > i ? Math.min(Mp[2 * id - i], mx - i) : 1;
			while((i - Mp[i] >= 0) && (i + Mp[i] < Ma.length) && (Ma[i + Mp[i]] == Ma[i - Mp[i]])){
					Mp[i] ++;
			}
			if(i + Mp[i] > mx){
				mx = i + Mp[i];
				id = i;
			}
 		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章