manacher算法模板

来源:互联网 发布:贴图软件 编辑:程序博客网 时间:2024/06/05 07:21

内存较大的:

#include <iostream>  #include <algorithm>  #include <cstdio>  #include <cstring>  #include <string>  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; i<li; i++)      {          s[len++] = str[i];          s[len++] = '#';      }  }  void getp()  {      gets();      memset(p, 0, sizeof(p));      int id = 0, mx = 0;      for(int i=1; i<len; i++)      {          int j = 2*id-i;          p[i] = mx>i ? 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<len; i++) ans = max(ans, p[i]-1);          printf("%d\n", ans);      }      return 0;  }   


内存较小的:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>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<<i<<" "<<d1[i]<<" "<<d2[i]<<endl;    ans = max(ans, max(d1[i]*2-1, d2[i]*2));    }    printf("%d\n", ans);    return 0;}/*9abcbaccab0 1 01 1 02 3 03 1 04 1 05 1 06 1 37 1 08 1 06*/


0 0
原创粉丝点击