hdu 4644 BWT (kmp)
2015-12-21 12:53
344 查看
看完题目你非常easy想到,这个题目的关键点就是怎样把给出的数组还原成原数组。
还原的原数组之后无论是AC自己主动机 还是 kmp都能够解决 - -尽管我认为kmp会超时的感觉。
那么怎样还原这个字符串就是在个题目的难点。。。
gc$aaac
1234567
排序之后变成了
$aaaccg
3456271
然后你依照排序后的下标依次走过去
会发现
$->a->c->a->a->c->g
3 5 2 4 6 7
也就恢复了原串。
还原的原数组之后无论是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\n");return ;} } printf("NO\n"); } 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; }
相关文章推荐
- Leetcode: Strobogrammatic Number III
- 如何设计一门语言(二)——什么是坑(b)
- Java ClassLoader 类加载 与 SOA后期优化
- Java线程:什么是线程
- 苹果与三星的竞争分析
- WordPress制作一个首字母排序的标签页面
- 如何设计一门语言(一)——什么是坑(a)
- START
- 生产者/消费者问题的多种Java实现方式
- 将Sublime Text3添加到右键菜单中
- 腾讯企业邮箱又一次隐藏了qq邮件列表的入口
- SVM入门(四)线性分类器的求解——问题的描述Part1
- INSERT INTO SELECT和SELECT INTO两种表复制语句
- nginx域名转发 负载均衡 反向代理
- WordPress制作圆形头像友情链接页面的方法
- git教程
- Mysql优化(一)—Sql语句
- SVM入门(一)至(三)Refresh
- iOS中怎么转为UTF-8
- oracle 两个时间相减