欧的字符串QWQ(更新中。。。)

比较正经QWQ

A

这里主要分成三部分:

  • Hash
  • Manacher
  • KMP

日常叭叭:字符串这个东西,说好理解也不难理解,说不好学它也真的不好学。代码倒是不长,相比起线段树那种板子,字符串的模板是真的短。
不过感觉字符串的题并不多,反正我做过的挺少的,肯定有的地方理解的是真的不够到位。后面肯定会多看多学,这一篇当然也不可能就这么搁着啦~

B Hash
C Manacher

先给模板题
试图代码敷衍:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e8+1;
char ss[maxn],s[maxn];
int p[maxn],ans,pos,Maxr,cnt=0;
int main(){
    scanf("%s",ss+1);
    int len=strlen(ss+1);
    s[0]='@';
    for(int i=1;i<=len;i++){
        s[++cnt]='*';s[++cnt]=ss[i];
    }
    s[++cnt]='*';
    len=cnt;
    for(int i=1;i<=len;i++){
        if(i<Maxr)p[i]=min(Maxr-i,p[pos*2-i]);
        while(s[i-p[i]-1]==s[i+p[i]+1])p[i]++;
        if(i+p[i]>Maxr)pos=i,Maxr=i+p[i];
        ans=max(ans,p[i]);
    }
    printf("%d\n",ans);
    return 0;
}

D KMP

模板题
再次试图代码敷衍QWQ:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+1;
int fail[maxn];
char a[maxn],b[maxn];
int main(){
    scanf("%s%s",a+1,b+1);
    int la=strlen(a+1);
    int lb=strlen(b+1);
    for(int i=2,j=0;i<=lb;i++){
        while(j&&b[i]!=b[j+1])j=fail[j];
        if(b[i]==b[j+1])j++;
        fail[i]=j;
    }
    for(int i=1,j=0;i<=la;i++){
        while(j&&a[i]!=b[j+1])j=fail[j];
        if(a[i]==b[j+1])j++;
        if(j==lb){printf("%d\n",i-lb+1);j=fail[j];}
    }
    for(int i=1;i<=lb;i++)printf("%d ",fail[i]);
    return 0;
}

今天主要是给个大概板子,以后再写~QWQ(试图萌混过关)

Date
7.28:大纲

猜你喜欢

转载自www.cnblogs.com/13ZY/p/13393988.html