HDU
来源:互联网 发布:mysql不能删除数据 编辑:程序博客网 时间:2024/06/06 05:56
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153
题目大意:两个字符串,把第二个串的后缀拿出去和第一个串比,累计次数。
解题思路:首先,先倒转下,把后缀变成前缀,因为只要最长的前缀匹配上,那么比他小的前缀一定能匹配上,所以只要找最长公共前缀,累加答案即可。
AC代码:
#include<cstring>#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const int MAXN = 1000000 + 5;const int MOD = 1000000000 + 7;int nxt[MAXN], ex[MAXN];char gt1[MAXN], gt2[MAXN];void getNext(char *str){ int i = 0, j, po, len = strlen(str); nxt[0] = len; while (str[i] == str[i + 1] && i + 1 < len) i++; nxt[1] = i; po = 1; for (i = 2;i < len;i++) { if (nxt[i - po] + i < nxt[po] + po) nxt[i] = nxt[i - po]; else { j = nxt[po] + po - i; if (j < 0) j = 0; while (i + j < len&&str[j] == str[j + i]) j++; nxt[i] = j; po = i; } }}void exKmp(char *s1, char *s2){ int i = 0, j, po, len = strlen(s1), l2 = strlen(s2); getNext(s2); while (s1[i] == s2[i] && i < l2&&i < len) i++; ex[0] = i; po = 0; for (i = 1;i < len;i++) { if (nxt[i - po] + i < ex[po] + po) ex[i] = nxt[i - po]; else { j = ex[po] + po - i; if (j < 0) j = 0; while (i + j < len&&j < l2&&s1[j + i] == s2[j]) j++; ex[i] = j; po = i; } }}int main(){ int t;scanf("%d", &t); while (t--) { LL ans = 0; scanf("%s%s", gt1, gt2); reverse(gt1, gt1 + strlen(gt1)); reverse(gt2, gt2 + strlen(gt2)); exKmp(gt1, gt2); for (int i = 0;i < strlen(gt1);++i) { ans += LL(1 + ex[i])*ex[i] / 2 % MOD; ans %= MOD; } printf("%I64d\n", ans); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 十一、mcg-helper_V1.0.0-Beta软件介绍
- 关于分布式事务、两阶段提交协议、三阶提交协议
- 【Git】6.解决冲突
- Max Sum(hdoj1003)
- CF 842D Vitya and Strange Lesson 01Trie(mex)
- HDU
- java的动态代理机制详解
- HTML5 地理定位
- 水平垂直居中固定比例 Div
- linux使用rz命令在终端中直接上传文件
- 金额转换
- Struts中常量配置,分模块开发,通配符,转发和重定向
- sgu236Greedy Path(最优比例路径)
- 贝叶斯分类算法