zoukankan      html  css  js  c++  java
  • hdu 4644 BWT (kmp)

    看完题目你非常easy想到,这个题目的关键点就是怎样把给出的数组还原成原数组。

    还原的原数组之后无论是AC自己主动机 还是 kmp都能够解决 - -尽管我认为kmp会超时的感觉。


    那么怎样还原这个字符串就是在个题目的难点。。。


    gc$aaac

    1234567

    排序之后变成了

    $aaaccg

     3456271


    然后你依照排序后的下标依次走过去

    会发现

    $->a->c->a->a->c->g 

      3     5   2   4    6    7

    也就恢复了原串。


    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #define maxn 100186
    using namespace std;
    
    struct node
    {
        char ch;
        int index;
        bool operator < (const node & cmp)const
        {
            return ch<cmp.ch;
        }
    }save[maxn];
    char t[maxn];
    char str[maxn],txt[maxn];
    int next[maxn];
    
    void getnext(int len)
    {
        next[0]=0;next[1]=0;
        for(int i=1;i<len;i++)
        {
            int j=next[i];
            while(j && txt[j]!=txt[i])j=next[j];
            next[i+1]=txt[j]==txt[i]?j+1:0;
        }
    }
    
    void find(int n,int m)
    {
        int j=0;
        for(int i=0;i<n;i++)
        {
            while(j&&txt[j]!=str[i])j=next[j];
            if(txt[j]==str[i])j++;
            if(j==m){printf("YES
    ");return ;}
        }
        printf("NO
    ");
    }
    
    int main()
    {
        while(scanf("%s",t)!=EOF)
        {
            int len=strlen(t);
            for(int i=0;i<len;i++)
            {
                save[i].ch=t[i];
                save[i].index=i;
            }
    
            stable_sort(save,save+len);
    
            int now=save[0].index;
            for(int i=0;i<len-1;i++)
            {
                str[i]=save[now].ch;
                now=save[now].index;
            }
    
            int q;
            scanf("%d",&q);
            while(q--)
            {
                scanf("%s",txt);
                int m=strlen(txt);
                getnext(m);
    
                find(len-1,m);
            }
        }
        return 0;
    }
    


  • 相关阅读:
    将最大主机/ DNS名称字符长度从63增加到255
    e3 cpu
    项目结构图
    Nyquist–Shannon sampling theorem 采样定理
    提高比特率 有损 无损 Video-and-Audio-file-format-conversion 视频声音转码
    比特率计算
    外微分
    功与路径无关的条件
    14.10.4 Defragmenting a Table 整理表
    14.10.4 Defragmenting a Table 整理表
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5063080.html
Copyright © 2011-2022 走看看