(新知)字符串--后缀数组--一个有个性的好模板
2016-12-17 19:57
302 查看
和其他的版本换汤不换药,以二元组的形式进行比较。时间复杂度为O(nlog2n)。
#include<bits/stdc++.h> using namespace std; #define len (int)str.size() const int maxn=int(1e6)+10; string str; int M=1; int s[maxn]; //序列数组 int rnk[maxn],tmp[maxn]; //排名数组、备用排名数组 bool cmp(int a,int b) { if(rnk[a]!=rnk[b]) return rnk[a]<rnk[b]; int x=a+M-1>len?-1:rnk[a+M-1]; int y=b+M-1>len?-1:rnk[b+M-1]; return x<y; } void print(string s,int pos) { for(int i=pos;i<=min((pos+M-1),int(s.size()));i++) cout<<s[i]; cout<<endl; return; } int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); getline(cin,str); for(int i=0;i<=len;i++) s[i]=i, rnk[i]=i<len?str[i]:-1; while(M<len) { M<<=1; sort(s,s+len+1,cmp); tmp[s[0]]=1; for(int i=1;i<=len;i++) if(!cmp(s[i-1],s[i])) tmp[s[i]]=tmp[s[i-1]]; else tmp[s[i]]=tmp[s[i-1]]+1; for(int i=0;i<=len;i++) rnk[i]=tmp[i]; } for(int i=0;i<=len;i++) print(str,s[i]); cout<<"--------\n"; return 0; }
相关文章推荐
- (字符串的模式匹配4.7.19——前缀数组suffix的应用)POJ 2752 Seek the Name, Seek the Fame(求解一个字符串中前缀和后缀一样的位置)
- SPOJ 694 求一个字符串有多少子串 后缀数组
- 用后缀数组 求一个字符串的最长重复字串
- cf244D. Match & Catch 字符串hash (模板)或 后缀数组。。。
- 准备学习后缀数组 先存一个论文里的模板
- cf244D. Match & Catch 字符串hash (模板)或 后缀数组。。。
- POJ2752_通过kmpNext数组的性质求一个字符串的公共同前后缀
- 后缀数组【模板】
- java中,如何将一个字节数组转换成字符串?
- 一个字符串到数组的例子 - 回复"成红"的问题, 对其他朋友参考价值不大
- 将一维或多维的数组连接成一个字符串的php代码
- POJ 2406 连续重复字符串(KMP)和后缀数组
- 字符串的一个操作(替换类似数组字符串中的项)
- asp.net中使用SPLIT这个函数把一个字符串分成数组
- 【转】如何将一个很长的字符串拆分成数组
- 转一个后缀数组的简单总结:
- [SID-EXAM]利用后缀数组求两个字符串的最长公共子串,较dp效率要高
- 新生帖:一个用于字符串数组的智能排序类,用于相似度的对比!
- 求一个串中出现的第一个最长可重叠重复子串 [后缀数组解法]
- 数组合并为一个字符串