博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu 2375 [NOI2014]动物园
阅读量:4325 次
发布时间:2019-06-06

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

字胡串什么的一直不太会,感觉这题…还蛮本质的

考虑暴力求解:num[i]相当于从一直跳nxt,如果nxt[j] * 2 <= i 那么就累加答案

其实这是一个树的结构,也就是说跳到一个结点满足条件,那么它上面的结点一定都满足,所以在求nxt的时候顺便递推一下每一个结点的答案,那么模拟一下匹配nxt的过程,只要跳到第一个j * 2 <= i 就可以算答案了

不会算时间复杂度QuQ

Code:

#include 
#include
using namespace std;typedef long long ll;const int N = 1e6 + 5;const ll mod = 1e9 + 7;int testCase, n, nxt[N];ll num[N];char s[N];int main() { for(scanf("%d", &testCase); testCase--; ) { scanf("%s", s + 1); n = strlen(s + 1); memset(nxt, 0, sizeof(nxt)); memset(num, 0, sizeof(num)); num[1] = 1; for(int i = 2, j = 0; i <= n; i++) { for(; j > 0 && s[j + 1] != s[i]; j = nxt[j]); if(s[j + 1] == s[i]) j++; nxt[i] = j; num[i] = num[j] + 1LL; } ll ans = 1LL; for(int i = 2, j = 0; i <= n; i++) { for(; j > 0 && s[j + 1] != s[i]; j = nxt[j]); if(s[j + 1] == s[i]) j++; for(; (j * 2) > i; j = nxt[j]); ans = ans * (num[j] + 1)% mod; } printf("%lld\n", ans); } return 0;}

 

转载于:https://www.cnblogs.com/CzxingcHen/p/9466367.html

你可能感兴趣的文章
面向对象编程思想概览(四)多线程
查看>>
二十三种设计模式及其python实现
查看>>
Math类、Random类、System类、BigInteger类、BigDecimal类、Date类、SimpleDateFormat、Calendar类...
查看>>
【设计模式】 访问者模式
查看>>
关于FFMPEG 中I帧、B帧、P帧、PTS、DTS
查看>>
request和response的知识
查看>>
bootstrap 表单类
查看>>
20165332第四周学习总结
查看>>
Codeforces Round #200 (Div. 1)D. Water Tree dfs序
查看>>
linux安全设置
查看>>
Myflight航班查询系统
查看>>
团队-团队编程项目爬取豆瓣电影top250-代码设计规范
查看>>
【linux驱动分析】之dm9000驱动分析(六):dm9000_init和dm9000_probe的实现
查看>>
json具体解释
查看>>
十一:Java之GUI图形Awt和Swing
查看>>
.net在arraylist用法
查看>>
android程序报错“error launching activity com.android.ddmlib.shellcommandunresponsiveexception”的解决方式...
查看>>
ORACLE中CONSTRAINT的四对属性
查看>>
DbVisualizer Pro 9.5.2中文乱码问题
查看>>
numpy.tile()
查看>>