manacher算法模板

内存较大的:

#include   
#include   
#include   
#include   
#include   
using namespace std;  
#define inf 310010  
char s[inf], str[inf];  
int p[inf], len;  
void gets()  
{  
    int li = strlen(str);  
    len = 0;  
    s[len++] = '&';  
    s[len++] = '#';  
    for(int i=0; ii ? min(p[j], mx-i):1;  
        while(s[i+p[i]] == s[i-p[i]]) p[i]++;  
        if(i+p[i] > mx)  
        {  
            mx = i+p[i];  
            id = i;  
        }  
    }  
}  
int main()  
{  
    while(~scanf("%s", str))  
    {  
        getp();  
        int ans=1;  
        for(int i=0; i


内存较小的:

#include 
#include 
#include 
#include 
using namespace std;
const int N = 2000010;
int n;
char s[N];
int d1[N], d2[N];
//d1[]记录的是奇数,d2[]记录的是偶数 
int main() {
    scanf("%d", &n);
    scanf("%s", s);
    for (int i = 0, l = 0, r = -1; i < n; ++i) {
        d1[i] = (i <= r ? min(d1[l + r - i], r - i + 1) : 1);
        while (i - d1[i] >= 0 && i + d1[i] < n && s[i - d1[i]] == s[i + d1[i]]) ++d1[i];
        if (i + d1[i] - 1 > r) l = i - d1[i] + 1, r = i + d1[i] - 1;
    }
    for (int i = 1, l = 0, r = -1; i < n; ++i) {
        d2[i] = (i <= r ? min(d2[l + r - i + 1], r - i + 1) : 0);
        while (i + d2[i] < n && i - d2[i] - 1 >= 0 && s[i + d2[i]] == s[i - d2[i] - 1]) ++d2[i];
        if (d2[i] > 0 && i + d2[i] - 1 > r) l = i - d2[i], r = i + d2[i] - 1;
    }
    int ans = 0;
    for(int i = 0; i < n; i++) {
    	cout<


你可能感兴趣的:(模板,Manacher算法)