zoukankan      html  css  js  c++  java
  • 【天梯 L2-008 最长对称子串 】 最长回文子串 manacher

    对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
    输入格式:

    输入在一行中给出长度不超过1000的非空字符串。
    输出格式:

    在一行中输出最长对称子串的长度。
    输入样例:

    Is PAT&TAP symmetric?

    输出样例:

    11

    Manacher模板

    #include <cstdio>
    #include <string>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    char ss[2010];
    int r[2010];
    int len;
    
    inline int min(int a, int b) {
    	return ( (a) < (b) ? (a) : (b)); 
    }
    void manacher() {
    	int mx = 0, id;
    	for (int i = 1; i <= len; i++) {
    		if (mx >= i) r[i] = min(r[2 * id - i], mx - i); 
    		else r[i] = 0;
    		while (ss[i + r[i] + 1] == ss[i - r[i] -1]) r[i]++;
    		if (i + r[i] > mx) id = i, mx = i + r[i];
    	}	
    }
    
    int main() {
    	string s;
    	
    	getline(cin, s);
    	ss[0] = '$'; ss[1] = '#';
    	int j = 2;
    	for (int i = 0; i < s.length(); i++) {
    		ss[j] = s[i]; ss[j + 1] = '#';
    		j += 2;
    	}
    	ss[j] = '';
    	len = j;
    	//
    	manacher();
    	//
    	int maxn = 0;
    	for (int i = 1; i < len; i++)
    		if (r[i] > maxn) maxn = r[i];
    	printf("%d
    ", maxn);
    	return 0;
    }
    
  • 相关阅读:
    CF321B Solution
    CF722D Solution
    CF729E Solution
    CF1447E Solution
    CF962F Solution
    DropDownList绑定数据
    连接数据库
    jqm随记的东西
    正则表达式过滤超链接内容(.net)
    linq lambda操作list的例子
  • 原文地址:https://www.cnblogs.com/Eirlys/p/12387505.html
Copyright © 2011-2022 走看看