首页 > 其他分享 >洛谷P2375 [NOI2014] 动物园

洛谷P2375 [NOI2014] 动物园

时间:2024-05-04 21:55:05浏览次数:29  
标签:洛谷 P2375 NOI2014 int num maxn ans lld mod

动物园

题目描述

输入格式

输出格式

输入输出样例

输入
3
aaaaa
ab
abcababc
输出
36
1
32

开始时都没看出来这是kmp板子题

先看看AC代码吧
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10;
const int mod=1e9+7;
char a[maxn];
int len,p[maxn],num[maxn];
//num[i]表示从i跳border能跳多少次,与题中的num数组含义不同 
void kmp()
{
	num[1]=1; 
	len=strlen(a+1);
	for (int i=2,j=0;i<=len;i++)
	  {
	  	while (j&&a[j+1]!=a[i]) j=p[j];
	  	if (a[j+1]==a[i]) j++;
	  	p[i]=j;num[i]=num[j]+1;//递推 
	  }
}
ll ans;
void solve()
{
	ans=1;
	for (int i=2,j=0;i<=len;i++)
	  {
	  	while (j&&a[i]!=a[j+1]) j=p[j];
	  	if (a[i]==a[j+1]) j++;
	  	while ((j<<1)>i) j=p[j];
	  	ans=ans*(num[j]+1)%mod;
	  }
	printf("%lld\n",ans);
}
int main()
{
	int n;
	scanf("%d",&n);
	while (n--)
	  {
	  	scanf("%s",a+1);
	  	kmp();solve();
	  }
	return 0;
}

注意事项

  • num[i]表示从i跳border能跳多少次,与题中的num数组含义不同
    从i跳border能跳多少次就表示可重叠的真前缀个数
    (题目中表示不重叠的真前缀个数)
  • 查找时每次j都从上一次j<=(i/2)时继承(不然会T)

错误示范:

void solve()
{
	ans=1;
	for (int i=1;i<=len;i++)
	  {
	  	int j=i;//遇到hack数据aaaaaaaaaaaaaa时每次向前跳一次会T
	  	while ((j<<1)>i) j=p[j];
	  	ans=ans*(num[j]+1)%mod;
	  }
	printf("%lld\n",ans);
}

正确示范:

void solve()
{
	ans=1;
	for (int i=2,j=0;i<=len;i++)
	  {
	  	while (j&&a[i]!=a[j+1]) j=p[j];
	  	if (a[i]==a[j+1]) j++;
	  	while ((j<<1)>i) j=p[j];
	  	ans=ans*(num[j]+1)%mod;
	  }
	printf("%lld\n",ans);
}

如上图中15号位的j由14号位的j+1继承而来(虽然由于有重叠会往前跳但那是之后的事
如果是错误代码则会从i开始一位一位往前跳时间复杂度太高会T

完结撒花!

标签:洛谷,P2375,NOI2014,int,num,maxn,ans,lld,mod
From: https://www.cnblogs.com/zhagnxinyue/p/18172774

相关文章

  • #交互,dp#洛谷 7998 [WFOI - 01] 猜数(guess)
    题目传送门分析首先要搞清楚,交互库的自适应会让区间长度尽可能增大(答案自适应)也就是说,如果现在区间为\([l,r]\),你选取的区间为\([l',r']\),那么交互库会让你的区间变成\([l,r'-1]\)和\([l'+1,r]\)中区间更长的那一个,不妨枚举这个长度设\(dp[i]\)表示区间长度为\(i\)......
  • 洛谷2664树上游戏-点分治
    link:https://www.luogu.com.cn/problem/P2664lrb有一棵树,树的每个节点有个颜色。给一个长度为\(n\)的颜色序列,定义\(s(i,j)\)为\(i\)到\(j\)的颜色数量。以及\[sum_i=\sum_{j=1}^ns(i,j)\]现在他想让你求出所有的\(sum_i\)。一个暴力的想法:因为是求和,所以可以拆......
  • 洛谷题单指南-动态规划2-P1091 [NOIP2004 提高组] 合唱队形
    原题链接:https://www.luogu.com.cn/problem/P1091题意解读:要挑选一个最长的先上升后下降的序列,求其余的元素数量解题思路:先计算正向的最长上升子序列,设f[i]表示以i结尾的正向最长上升子序列再计算逆向的最长上升子序列,设g[i]表示以i结尾的逆向最长上升子序列再枚举所有的i<j,m......
  • 洛谷 P5293 [HNOI2019] 白兔之舞
    洛谷传送门所求即为:\[\begin{aligned}f_t&=\sum\limits_{m=0}^L\binom{L}{m}A^m[k\midm-t]\\&=\frac{1}{k}\sum\limits_{m=0}^L\binom{L}{m}A^m\sum\limits_{i=0}^{k-1}\omega_k^{i(m-t)}\\&=\frac{1}{k}\sum\l......
  • 洛谷题单指南-动态规划2-P1004 [NOIP2000 提高组] 方格取数
    原题链接:https://www.luogu.com.cn/problem/P1004题意解读:从起点走到终点,走两次,计算最大路径和,第一次走过的点数值变为0。解题思路:直观上思考,可以先从起点走到终点,计算最大路径和,并记录走过的所有点,然后把所有点的数值置为0,再从起点走到终点,计算最大路径和,把两次的最大路径......
  • 洛谷 P10084 [GDKOI2024 提高组] 计算
    洛谷传送门第一步是一个经典结论,\(L=m^{\gcd(a,b)}+1\),\(R=m^{\gcd(c,d)}\)。因为\(L\equiv1\pmodm\)且\(R\equiv0\pmodm\),所以可以把问题的范围改成\([1,n=R-L+1]\)。写出选数的生成函数:\[F(x)=\prod\limits_{i=1}^n(1+x^i)\]我们希望求......
  • 题解:洛谷 P1137 旅行计划
    标签:图论,拓扑,dp题意给定一张\(n\)个点\(m\)条边的DAG,对于每个\(i\),求以它为终点最多经过多少个点?思路由于是DAG,求的是终点\(i\)经过的所有点,而刚好拓扑序就满足这个。那么就可以考虑拓扑排序。设\(f_i\)是以\(i\)为终点的最多结点数,那么就有转移方程\(f_v=m......
  • 洛谷P5597 复读
    洛谷P5597复读首先概括一下题意:文中给出三个指令L(命令机器人向当前节点的左子节点走)、R(命令机器人向当前节点的右子节点走)、U(命令机器人向当前节点的父亲节点走)以及一颗二叉树。初始状态,机器人在二叉树的根节点。当机器人处于二叉树的根节点时,不可以执行指令U,但是机器人可以走......
  • 「洛谷」题解:P1008 三连击
    题目传送门题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将\(1,2,\ldots,9\)共\(9\)个数分成\(3\)组,分别组成\(3\)个三位数,且使这\(3\)个三位数构成\(1:2:3\)的比例,试求出所有满足条件的......
  • 洛谷题单指南-动态规划2-P2679 [NOIP2015 提高组] 子串
    原题链接:https://www.luogu.com.cn/problem/P2679题意解读:在a中按顺序挑选k个子串,使得这些子串连在一起正好和b相等,求方案数。解题思路:这样的题目,无外乎两个思路:DFS暴搜(得部分分)、动态规划动态规划不好想,还是先暴搜吧!1、DFS暴搜搜索的思路就是:从a起始位置开始,一直找到跟b前......