字符串同构最小最大表示法模板&&manacher模板

来源:互联网 发布:淘宝牙膏属于什么类目 编辑:程序博客网 时间:2024/06/05 09:13

指的字典序最小或者最大的...对于某个字符串来说通过循环移位得到的就是同构..

int minmaxstring(char *s,bool bMin=true){    int i = 0, j = 1, k = 0, l = strlen(s), sub;    while (i<l && j<l && k<l)    {        sub = s[(i+k)%l] -  s[(j+k)%l];        if (sub == 0)            k++;        else        {            if (bMin?sub > 0:sub < 0)                i += k+1;            else                j += k+1;            if (i == j)                j++;            k = 0;        }    }    return i<j?i:j;}

manacher模板

#include"cstdio"#include"iostream"#include"cstring"#include"algorithm"#define N 110005using namespace std;char a[N],b[N*2];int rad[N*2];  // rad[i]代表以i为中心的最大回文半径int main(){    while(scanf("%s",&a[1])!=-1){       //以下标1读入方便使用        int maxl,maxid,id;        int i,len;        for(i=1;a[i];i++){         // 插入'#' 使得所有回文串为奇数            b[i*2]=a[i];            b[i*2+1]='#';        }        len=2*i;b[0]='?'; b[1]='#'; b[len]='\0';   // 防越界  头尾区别        maxid=id=0;        maxl=0;        for(i=1;i<len;i++){            if(maxid>i)  rad[i]=min(rad[2*id-i],maxid-i);  // 利用对称性优化复杂度            else  rad[i]=1;            while(b[i-rad[i]]==b[i+rad[i]]){       //对于当前点 搜索半径                rad[i]++;            }            if(rad[i]+i>maxid){                maxid=rad[i]+i;                id=i;            }            if(rad[i]>maxl) maxl=rad[i];        }        printf("%d\n",maxl-1);    }}


0 0