【BZOJ】3670: [Noi2014]动物园

本文深入解析了一道NOI竞赛题目,通过KMP算法预处理和动态规划求解子串出现次数,最终计算所有可能子串的组合数。代码实现清晰,展示了高效的算法设计思路。

http://www.lydsy.com/JudgeOnline/problem.php?id=3670

题意:太水了= =

#include <bits/stdc++.h>
using namespace std;
const int N=1000005, mo=1000000007;
int n, p[N], pos[N], num[N], tot;
char s[N];
bool vis[N];
void dfs(int x) { if(p[x]) dfs(p[x]); vis[x]=1; pos[++tot]=x; }
void work(int x) {
	tot=0;
	dfs(x);
	for(int i=1, j=0; i<=tot; ++i) {
		while(pos[j+1]*2<=pos[i]) ++j;
		num[pos[i]]=j;
	}
}
void clr() { memset(p, 0, sizeof(int)*(n+1)); memset(vis, 0, sizeof(bool)*(n+1)); memset(num, 0, sizeof(int)*(n+1)); }
int main() {
	int T; scanf("%d", &T);
	while(T--) {
		scanf("%s", s+1);
		n=strlen(s+1);
		int j=0;
		for(int i=2; i<=n; ++i) {
			while(j && s[j+1]!=s[i]) j=p[j];
			if(s[j+1]==s[i]) ++j;
			p[i]=j;
		}
		for(int i=n; i>=1; --i) if(!vis[i]) work(i);
		long long ans=1;
		for(int i=1; i<=n; ++i) (ans*=(num[i]+1))%=mo;
		printf("%lld\n", ans);
		clr();
	}
	return 0;
}

  

这种题放在noi= =无语= =

大概就是随便搞搞就行辣...

转载于:https://www.cnblogs.com/iwtwiioi/p/4385571.html

问题陈述 在AtCoder的国家有 $N$ 个动物园,编号为 $1$ 到 $N$ 。 $i$ 动物园门票为 $C_i$ 日元。 铃木先生喜欢 $M$ 种动物,动物 $1,\dots,M$ 。 $i$ 可以在 $K_i$ 动物园看到,即动物园 $A_{i,1},\dots,A_{i,K_i}$ 。 求所有动物每种至少看两次所需的最低总入场费。 如果你多次访问同一个动物园,那里的动物被认为每次访问一次。 # # #约束 —— $1 \le N \le 10$ —— $1 \le M \le 100$ —— $0 \le C_i \le 10^9$ —— $1 \le K_i \le N$ —— $1 \le A_{i,j} \le N$ —— $j \neq j' \Longrightarrow A_{i,j} \neq A_{i,j'}$ —所有输入值均为整数。 # # #输入 输入来自标准输入,格式如下: $N$ $M$ $C_1$ $\dots$ $C_N$ $K_1$ $A_{1,1}$ $\dots$ $A_{1,K_1}$ $\vdots$ $K_M$ $A_{M,1}$ $\dots$ $A_{M,K_M}$ ###输入1 4 3 1000 300 700 200 3 1 3 4 3 1 2 4 2 1 3 ###输出示例 1800 例如,下面的时间表实现了看到 $1,2,3$ 动物至少两次,共计 $1800$ 日元: -去动物园 $3$ 。支付 $700$ 日元,看到动物 $1$ 和 $3$ 。 -去动物园 $3$ 。支付 $700$ 日元,看到 $1$ 和 $3$ 动物。 -去动物园 $4$ 。支付 $200$ 日元,可以看到 $1$ 和 $2$ 动物。 -去动物园 $4$ 。支付 $200$ 日元,看到动物 $1$ 和 $2$ 。 ###示例输入2 7 6 500 500 500 500 500 500 1000 3 1 2 7 3 2 3 7 3 3 4 7 3 4 5 7 3 5 6 7 3 6 1 7 ###示例输出2 2000 通过参观两次动物园 $7$ ,您可以看到 $1,2,3,4,5,6$ 每只动物两次,共计 $2000$ 日元。 写出这道题目的c++代码,并保证通过所有样例,运行时间在2s内,运行内存在256mb内
05-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值