c语言字符串编程练习题.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.题意: 找出原串中出现超过2次的子串的数 目,每个子串出现多次时不可重叠。 分析: 枚举子串的长度len,找到满足连续的height[i] len的最左端 l 和最右端的位置 r,如果r-l len 说明子串没有重叠。 #include cstdio #include cstring #include algorithm using namespace std; const int maxn 1005; int N; char s[maxn]; int sa[maxn],t[maxn],t2[maxn],c[maxn]; void suffix_sa(int n, int m) { int i, *x t, *y t2; for (i 0; im; i++) c[i] 0; for (i 0; in; i++) c[x[i] s[i]]++; for (i 0; im; i++) c[i] + c[i-1]; for (i n-1; i 0; i--) sa[--c[x[i]]] i; for (int k 1; k n; k 1) { int p 0; for (i n-k; in; i++) y[p++] i; for (i 0; in; i++) if (sa[i] k) y[p++] sa[i]-k; for (i 0; im; i++) c[i] 0; for (i 0; in; i++) c[x[y[i]]]++; for (i 0; im; i++) c[i] + c[i-1]; for (i n-1; i 0; i--) sa[--c[x[y[i]]]] y[i]; swap(x,y); p 1; x[sa[0]] 0; for (i 1; in; i++) x[sa[i]] y[sa[i-1]] y[sa[i]]y[sa[i-1]+k] y[sa[i]+k]?p-1:p++; if (p n) break; m p; } } int rank[maxn],height[maxn]; void getheight() { int i, j , k 0; for (i 1; i N; i++) rank[sa[i]] i; for (i 0; iN; i++){ if (k) k--; int j sa[rank[i]-1]; while (s[i+k] s[j +k]) k++; height[rank[i]] k; } } void solve() { N strlen(s); suffix_sa(N+1,z+1); getheight(); int res 0; int i, j , k, l, r; for (i 1; iN/2+1; i++) { l N,r -1; for (j 2; j N; j ++) { if (height[j] i) { r max(r,max(sa[j-1],sa[j])); l min(l,min(sa[j-1],sa[j])); } else if (height[j]i) {

文档评论(0)

xina171127 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档