Luogu P2375 [NOI2014] 动物园
[NOI2014] 动物园
题目描述
近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。
某天,园长给动物们讲解 KMP 算法。
园长:“对于一个字符串
熊猫:“对于字符串
园长:“非常好!那你能举个例子吗?”
熊猫:“例
园长表扬了认真预习的熊猫同学。随后,他详细讲解了如何在
下课前,园长提出了一个问题:“KMP 算法只能求出
最后,园长给出了奖励条件,第一个做对的同学奖励巧克力一盒。听了这句话,睡了一节课的企鹅立刻就醒过来了!但企鹅并不会做这道题,于是向参观动物园的你寻求帮助。你能否帮助企鹅写一个程序求出
特别地,为了避免大量的输出,你不需要输出
输入格式
第
随后
输出格式
包含
样例 #1
样例输入 #1
3 aaaaa ab abcababc
样例输出 #1
36 1 32
提示
测试点编号 | 约定 |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 |
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; char s[5211314 >> 2]; long long nex[5211314 >> 2], num[5211314 >> 2], n; long long sum[5211314], nex2[5211314 >> 2]; int main() { cin >> n; while (n --) { memset(nex, 0, sizeof(nex)); memset(num, 0, sizeof(num)); memset(nex2, 0, sizeof(nex2)); memset(sum, 0, sizeof(sum)); scanf("%s", s + 1); long long len = strlen(s + 1), ans = 1; nex[0] = 1; for (long long i = 2, j = 0, tem; i <= len; ++ i) { while (j > 0 && s[j + 1] != s[i]) { j = nex[j]; } if (s[j + 1] == s[i]) j ++; nex[i] = j; if (j != 0) sum[i] = sum[j] + 1; //防止出现跳到0的情况 } nex2[0] = 1; for (int i = 2, j = 0; i <= len; ++ i) { while (j > 0 && s[j + 1] != s[i]) { j = nex2[j]; } if (s[j + 1] == s[i]) j ++; while (j > (i / 2)) { // 若原先的j大于二分之一的长度 // 就需要向前找到小于二分之一长度的相同前后缀 j = nex[j]; } nex2[i] = j; } for (int i = 1, tem; i <= len; ++ i) { tem = nex2[i]; if (tem != 0) num[i] = (sum[tem] + 1); //防止出现没有相同前后缀而加一 ans *= (num[i] + 1); ans %= 1000000007; } cout << ans << endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具