题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4644

题意:给出一个串,按照下面的步骤得到一个新串:

(1)首先将其后面增加一个美元符号;

(2)将每个后缀写下,并将前面的补在后面;

(3)排序;

(4)取下最后一列,得到新串。

现在给出新串。再给出一些串,问这些串是不是原串的子串。

思路:首先,我们要做的就是还原原串。下面是题解给出的还原的方法:

乍看上去是O(n^2logn)的!!其实有O(n)还原的方法。不过也是借助于上面的思路。对于上面得到的串gc$aaac为例,首先,为其编号0到6,那么排序后得到为:$aaaccg,编号为2345160(记为W)。我们想一下,以后每次排序得到的W和现在的都是一样的。想想,若首字母不同则显然,小的字母以后还是在前面,比如$开始的这个串一直排名第一;对于相同的字母,比如3个a,那么越靠前的a其后面补的字母越小,还是越靠前。因此,排名第一的串的第一个字母为2=a[0]位置的$;而第一轮补给2位置的为4=a[2]位置的a,第二轮跑到了0位置的串即$的后面。依次类推即可。

之后对于每个查询就是KMP匹配即可。

char s[N],S[N];
int n,a[N];

int cmp(int x,int y)
{
    if(s[x]==s[y]) return x<y;
    return s[x]<s[y];
}

int next[N];

int cal()
{
    next[0]=-1;
    int i=0,j=-1;
    int len=strlen(s);
    while(i<len)
    {
        if(j==-1||s[i]==s[j]) i++,j++;
        else j=next[j];
    }
    i=0,j=0;
    while(i<n)
    {
        if(j==-1||S[i]==s[j]) i++,j++;
        else j=next[j];
        if(j==len) return 1;
    }
    return 0;
}

int main()
{
    while(scanf("%s",s)!=-1)
    {
        n=strlen(s);
        int i;
        FOR0(i,n) a[i]=i;
        sort(a,a+n,cmp);
        int t=a[0];
        FOR0(i,n)
        {
            S[i]=s[t];
            t=a[t];
        }
        int m;
        RD(m);
        while(m--)
        {
            RD(s);
            if(cal()) puts("YES");
            else puts("NO");
        }
    }
}

HDU 4644 BWT(Burrows–Wheeler transform+KMP)的更多相关文章

  1. HDU 1686 Oulipo (可重叠匹配 KMP)

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. HDU 2087 剪花布条(字符串匹配,KMP)

    HDU 2087 剪花布条(字符串匹配,KMP) Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出 ...

  3. HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)

    HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP) Description The French author George ...

  4. HDU 6311 Cover (无向图最小路径覆盖)

    HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...

  5. HDU 4289 Control (网络流,最大流)

    HDU 4289 Control (网络流,最大流) Description You, the head of Department of Security, recently received a ...

  6. HDU 4292 Food (网络流,最大流)

    HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college's dining ...

  7. HDU - 3613 Best Reward(manacher或拓展kmp)

    传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...

  8. hdu 4289 Control(最小割 + 拆点)

    http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  9. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

随机推荐

  1. 【BZOJ】【1049】【HAOI2006】数字序列

    DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/ ...

  2. 【BZOJ】【2756】【SCOI2012】奇怪的游戏

    网络流-最大流 这题……建模部分先略过 这道题是会卡时限的T_T俺的Dinic被卡了,在此放几篇很棒的讲网络流算法的文章,至于大家耳熟能详的论文就不放了…… http://www.cppblog.co ...

  3. Javascript动态生成表格的性能调优

        vision 0.8 [耗时672ms]终极优化 将字符串作为数组对象的方式是目前效率最高,性能最优的方式.   <script> var t1 = new Date(); < ...

  4. WPF编程学习——布局

    本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面设计中,合理的元素布局至关重要, ...

  5. Codeforces Round #261 (Div. 2)

    第一场难得DIV2简单+AK人数多: E:给出一张图,求最多的边数,满足:在这个边的集合中后面的边的权值大于前面的边; 思路:我们将图按权值排列,以为只可能边权值小的跟新权值大的所以对于一条边我们只跟 ...

  6. SQL TRY CATCH

    begin try select 1/0end trybegin catch select error_number() as 'number', error_line() as 'line', er ...

  7. 13test07;字符排序,去重,三三输出

    #include<iostream> #include<string> using namespace std; void buddle(char*,int);//对输入字符的 ...

  8. 利用正则表达式解析URL

    -(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress {      NSError *error;      NSS ...

  9. iOS学习资料链接

    http://www.cocoachina.com/ios/20150111/10894.html

  10. LoaderManager使用详解(一)---没有Loader之前的世界

    来源: http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html 感谢作者Alex ...