博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2752 Seek the Name, Seek the Fame
阅读量:6519 次
发布时间:2019-06-24

本文共 1300 字,大约阅读时间需要 4 分钟。

问题链接:。

读懂题后知道,这个题要算的是,给定一个字符串s,有哪些长度的s的前缀,同时也是s的后缀。

首先明确一下前缀和后缀的概念。字符串s的前缀是指,从s的开始字符到s的任意字符为止的子串。字符串s的后缀是指,从s的任意字符到s的最后字符为止的子串。s是既是自身的前缀也是自身的后缀。

这个问题利用KMP算法的next[]数组来解。首先对于输入的字符串s,计算其next[]数组。然后,根据next[]数组的值进行进一步的计算。

还需要知道的是next[]数组的定义。对于字符串s的第i个字符s[i],next[i]定义为字符s[i]前面最多有多少个连续的字符和字符串s从初始位置开始的字符匹配。

从后到前匹配前缀和后缀。如果前缀与后缀匹配,则下一个前缀与后缀匹配的字符串只能在前缀中。

AC程序如下:

/* POJ2752 Seek the Name, Seek the Fame */#include 
#include
char s[400000+1];int next[400000+1];int result[400000+1];void setnext(char s[], int next[], int len){ next[0] = -1; int i = 0, j = -1; while (i < len) { if (j == -1 || s[i] == s[j]) { ++i; ++j; next[i] = j; } else j = next[j]; }}int main(void){ int count, t, i; while(scanf("%s", s) != EOF) { int len = strlen(s); // 计算next[]数组值 setnext(s, next, len); // 计算结果:从字符串的尾部开始,下一个只能在与后缀相同的前缀字符串中 count = 0; t = next[len - 1]; while(t != -1) { if(s[t] == s[len - 1]) result[count++] = t + 1; t = next[t]; } // 输出结果 for(i=count-1; i>=0; i--) printf("%d ", result[i]); printf("%d\n", len); } return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7564686.html

你可能感兴趣的文章
C#基础第五天
查看>>
uva 12325 枚举暴力 b
查看>>
POJ 3268 Silver Cow Party
查看>>
EMLS项目推进思考
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
2018-2019-1 20165302 实验五 通讯协议设计
查看>>
Golang 知识点总结
查看>>
JAVA 8 特性
查看>>
算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
查看>>
WebService之Axis2快速入门(7): Spring与axis整合发布为WebServic
查看>>
Uliweb查看模板调用关系
查看>>
C#与PHP通信压缩
查看>>
关于 Linux
查看>>
ios开发之导航控制器的原理
查看>>
《Netkiller Blockchain 手札》Hyperledger Fabric Java SDK Demo
查看>>
Linux系统_Centos7下安装Nginx
查看>>
数据库设计 Step by Step (6) —— 提取业务规则
查看>>
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>