标签:清除 using void code style 多次 tar xen 原创
fl说今天是20200202,是个回文串,lzz应该整理一下回文串算法,于是整理一下马拉车。
很简单的回文字符串寻找算法,纯原创板子,返回信息最全,已过HDU上的板题,清除了上一次的残余信息而可多次调用。
1 #include<bits/stdc++.h> 2 #define pf printf 3 #define f(i,a,b) for(int i=a;i<=b;i++) 4 using namespace std; 5 const int maxn=110005; 6 char ma[maxn]; 7 char tem[maxn<<1]; 8 int mp[maxn<<1]; 9 void manacher(char ma[],int mp[],int len,int &maxlen,int &maxstart,int &maxend){ 10 maxlen=-1; 11 tem[0]=‘$‘; 12 tem[1]=‘#‘; 13 int l=2; 14 f(i,1,len){ 15 tem[i<<1]=ma[i-1]; 16 tem[(i<<1)+1]=‘#‘; 17 } 18 int maxright=0,id=0; 19 len=1+(len<<1); 20 tem[len+1]=‘\0‘; 21 f(i,0,len){ 22 if(i<maxright){ 23 if(maxright-i>mp[(id<<1)-i]){ 24 mp[i]=mp[(id<<1)-i]; 25 if(i+mp[i]>maxright){ 26 id=i; 27 maxright=i+mp[i]; 28 } 29 } 30 else if(maxright-i<mp[(id<<1)-i]){ 31 mp[i]=maxright-i; 32 if(i+mp[i]>maxright){ 33 id=i; 34 maxright=i+mp[i]; 35 } 36 } 37 else{ 38 mp[i]=maxright-i; 39 while(tem[i+mp[i]]==tem[i-mp[i]]){ 40 mp[i]++; 41 } 42 if(i+mp[i]>maxright){ 43 id=i; 44 maxright=i+mp[i]; 45 } 46 } 47 } 48 else{ 49 mp[i]=1; 50 while(tem[i+mp[i]]==tem[i-mp[i]]){ 51 mp[i]++; 52 } 53 if(i+mp[i]>maxright){ 54 id=i; 55 maxright=i+mp[i]; 56 } 57 } 58 if(mp[i]-1>maxlen){ 59 maxlen=mp[i]-1; 60 maxstart=(i-maxlen)/2; 61 } 62 } 63 maxend=maxstart+maxlen-1; 64 } 65 int main(){ 66 while(~scanf("%s",ma)){ 67 int len=strlen(ma); 68 int maxstart,maxend,maxlen; 69 manacher(ma,mp,len,maxlen,maxstart,maxend); 70 pf("%d\n",maxlen); 71 // f(i,maxstart,maxend){ 72 // pf("%c",ma[i]); 73 // } 74 // pf("\n"); 75 } 76 }
标签:清除 using void code style 多次 tar xen 原创
原文地址:https://www.cnblogs.com/St-Lovaer/p/12245272.html