• 字符串知识点大集合


    1.manachar 马拉车 算法

         -------求最长回文串

    时间复杂度为 O(n)

    int Init()   //此操作目的是消除奇偶性
    {
    int len=strlen(s);
    s[0]='@'; s[1]='#';
    int j=2;
    
    for(int i=0;i<len;i++)
    {
    s[j++]=s[i];
    s[j++]='#';
    }
    s[j]='';
    
    return j;  //返回修改后的长度  
    }
    
    int manachar()
    {
    int len=Init();
    int  ans=-1;int p=0;
    int maxlen=0;
    
    for(int i=1;i<len;i++)
    {
    if(i<maxlen)r[i]=min(r[2*p-i],maxlen-i+1);
    else r[i]=1;
    while (s[i-r[i]]==s[i+r[i]])r[i]++;
    if(maxlen<i+r[i]-1)
    {
    p=i;
    maxlen=i+r[i]-1;
    }
    ans=max(ans,r[i]-1);
    }
    return ans;
    }
     
    

      

    2. kmp!

       

    void kmp()
    {
    fail[1]=j=0;
    for(int i=2;i<=m;i++)
    {
    while (j&&a[j+1]!=b[i])j=fail[i];
    if(fail[j+1]==fail[i])j++;
    fail[i]=j;
    }
    j=0;
    for(int i=1;i<=n;i++)
    {
    while(j&&b[j+1]!=fa[i])j=fail[j];
    if(b[j+1]==a[i])j++;
    if(j==m)
    {
    cout<<"match:"<<i-m+1<<endl;
    j=fail[j];
    }
    }
    
    }
    

      

    3.hash

    bool mark[524288];
    unsigned int checkhash(string str)
    {
    unsigned int seed=131;
    unsigned int hash =0,i=0;len=sre.length();
    while(i<len)hash=hash*seed+str[i++];
    return (hash&0x7FFFF);
    }
    

      

    4.最小表示法

    cin>>s;
    l=s.length();
    s=s+s;
    i=0,j=1;
    while(i<l&&j<l)
    {
    for(k=0;k<l;k++)
    if(s[i+k]!=s[j+k])break;
    if(k==l)break;
    if(s[i+k]>s[j+k])i+=k+1;
    else if(s[i+k]<s[j+k])j+=k+1;
    if(i==j)j++;
    }
    cout<<min(i,j)<<endl;
    

      

  • 相关阅读:
    JS动态计算rem
    Vue数据双向绑定原理
    NOI2019 退役记
    友情链接
    算法博客总结
    总结各类错误(always online)
    学习笔记:powerful number求积性函数前缀和
    LOJ#2409. 「THUPC 2017」小 L 的计算题 / Sum(生成函数)
    多项式简单操作
    LOJ #3103. 「JSOI2019」节日庆典
  • 原文地址:https://www.cnblogs.com/cocacolalala/p/11345046.html
Copyright © 2020-2023  润新知