• POJ3974Palindrome(Manacher)


    传送门

    题目大意:求最长回文串

    题解:Manacher

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    const int maxn=1e6+5;
    char s[maxn*2],str[maxn*2];
    int Len[maxn*2],len;
    
    void getstr()
    {
        int k=0;
        str[k++]='$';
        for(int i=0;i<len;i++)
            str[k++]='#',
            str[k++]=s[i];
        str[k++]='#';
        len=k;
    }
    
    void Manacher()
    {
        getstr();
        int mx=0,id;
        for(int i=1;i<len;i++)
        {
            if(mx>i) Len[i]=min(Len[2*id-i],mx-i);
            else Len[i]=1;
            while(str[i+Len[i]]==str[i-Len[i]]) 
                Len[i]++;
            if(Len[i]+i>mx)
                mx=Len[i]+i,id=i;
        }
    }
    
    int main()
    {
        int n,js=0;
        for(;;)
        {
            scanf("%s",&s);
           // if(s=="END") break;
            if(s[0]=='E'&&s[1]=='N'&&s[2]=='D') break;
            len=strlen(s);
            Manacher();
            int ans=1;
            for(int i=1;i<len;i++) ans=max(ans,Len[i]);
            printf("Case %d: %d
    ",++js,ans-1);
        }
        return 0;
    }
  • 相关阅读:
    CSS display使用
    WPF触发器
    WPF动画2
    WPF动画2
    WPF 动画1
    CSS 媒体查询
    [Leetcode] Rotate List
    [Leetcode] Add Two Numbers
    [Leetcode] Sort List
    [Leetcode] Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/zzyh/p/12005436.html
Copyright © 2020-2023  润新知