C - Tachibana Kanade's Tofu

思路:把 n 个串丢进AC自动机中,然后dp就好啦。 我的代码居然是在CF上跑最快的。。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); int n, m, len, k, tmp, v[];
vector<int> L, R;
vector<int> s; inline void add(int &a, int b) {
a += b; if(a >= mod) a -= mod;
} struct Ac {
int ch[][], val[], f[], tot, sz;
int dp[][][][], cur, pre;
void init(int _sz) {tot = ; sz = _sz;}
inline int newNode() {
tot++; f[tot] = ; val[tot] = ;
memset(ch[tot], , sizeof(ch[tot]));
return tot;
}
inline int idx(int c) {return c;}
void addStr(vector<int> &s, int cost) {
int u = ;
for(int i = ; i < s.size(); i++) {
int c = idx(s[i]);
if(!ch[u][c]) ch[u][c] = newNode();
u = ch[u][c];
}
val[u] += cost;
}
void build() {
queue<int> que;
for(int c = ; c < sz; c++) {
int v = ch[][c];
if(!v) ch[][c] = ;
else f[v] = , que.push(v);
}
while(!que.empty()) {
int u = que.front(); que.pop();
val[u] += val[f[u]];
for(int c = ; c < sz; c++) {
int v = ch[u][c];
if(!v) ch[u][c] = ch[f[u]][c];
else f[v] = ch[f[u]][c], que.push(v);
}
}
}
int solve(vector<int> &str) {
int n = str.size(), ans = ;
cur = , pre = ;
memset(dp[cur], , sizeof(dp[cur]));
for(int z = ; z <= str[]; z++) {
int v = ch[][z];
if(val[v] <= k) add(dp[cur][v][val[v]][z == str[]], );
}
for(int i = ; i < n; i++) {
swap(cur, pre);
memset(dp[cur], , sizeof(dp[cur]));
for(int z = ; z < m; z++) {
int v = ch[][z];
if(val[v] <= k) add(dp[cur][v][val[v]][], );
}
for(int u = ; u <= tot; u++) {
for(int s = ; s <= k; s++) {
if(dp[pre][u][s][]) {
for(int z = ; z < m; z++) {
int v = ch[u][z];
if(s+val[v] <= k) add(dp[cur][v][val[v]+s][], dp[pre][u][s][]);
}
} if(dp[pre][u][s][]) {
for(int z = ; z <= str[i]; z++) {
int v = ch[u][z];
if(s+val[v] <= k) add(dp[cur][v][val[v]+s][z==str[i]], dp[pre][u][s][]);
}
}
}
}
}
for(int u = ; u <= tot; u++)
for(int j = ; j <= k; j++)
add(ans, dp[cur][u][j][]), add(ans, dp[cur][u][j][]);
return ans;
}
} ac; int main() {
scanf("%d%d%d", &n, &m, &k);
ac.init(m);
scanf("%d", &len); L.resize(len);
for(int i = ; i < len; i++) scanf("%d", &L[i]);
scanf("%d", &len); R.resize(len);
for(int i = ; i < len; i++) scanf("%d", &R[i]);
for(int i = ; i < n; i++) {
scanf("%d", &len); s.resize(len);
for(int j = ; j < len; j++) scanf("%d", &s[j]);
int cost; scanf("%d", &cost);
ac.addStr(s, cost);
for(int p = ; p+s.size() <= L.size(); p++) {
bool flag = true;
for(int q = ; q < s.size(); q++) {
if(s[q] != L[q+p]) {
flag = false;
break;
}
}
if(flag) tmp += cost;
}
}
ac.build();
int ans = (ac.solve(R) - ac.solve(L) + (tmp <= k) + mod) % mod;
printf("%d\n", ans);
return ;
}
/*
*/

Codeforces Round #248 (Div. 1) C - Tachibana Kanade's Tofu AC自动机的更多相关文章

  1. Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note

    题目链接:http://codeforces.com/contest/433/problem/C 思路:可以想到,要把某一个数字变成他的相邻中的数字的其中一个,这样总和才会减少,于是我们可以把每个数的 ...

  2. Codeforces Round #248 (Div. 2)C 题

    题目:http://codeforces.com/contest/433/problem/C 没想到做法就各种纠结, 今天做的都快疯掉了, 太弱了, 等题解一出,就各种恍然大悟 不应该不应该 正文: ...

  3. Codeforces Round #248 (Div. 2) (ABCD解决问题的方法)

    比赛链接:http://codeforces.com/contest/433 A. Kitahara Haruki's Gift time limit per test:1 second memory ...

  4. Codeforces Round #248 (Div. 1) B. Nanami's Digital Board 暴力 前缀和

    B. Nanami's Digital Board 题目连接: http://www.codeforces.com/contest/434/problem/B Description Nanami i ...

  5. Codeforces Round #248 (Div. 1) A. Ryouko's Memory Note 水题

    A. Ryouko's Memory Note 题目连接: http://www.codeforces.com/contest/434/problem/A Description Ryouko is ...

  6. Codeforces Round #248 (Div. 2) B称号 【数据结构:树状数组】

    主题链接:http://codeforces.com/contest/433/problem/B 题目大意:给n(1 ≤ n ≤ 105)个数据(1 ≤ vi ≤ 109),当中有m(1 ≤ m ≤  ...

  7. Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones

    题目简单描述就是求数组中[l,r]区间的和 #include <iostream> #include <vector> #include <string> #inc ...

  8. Codeforces Round #248 (Div. 2) A. Kitahara Haruki's Gift

    解决思路是统计100的个数为cnt1,200的个数为cnt2 则 cnt1    cnt2 奇数      奇数 奇数      偶数 偶数      奇数 偶数     偶数 当cnt1为奇数时一定 ...

  9. Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note (vector 替换)

    题目链接 题意:给m个数字, 这些数字都不大于 n,  sum的值为相邻两个数字 差的绝对值.求这n个数字里把一个数字 用 其中另一个数字代替以后, 最小的sum值. 分析:刚开始以为两个for 最坏 ...

随机推荐

  1. java synchronized 的原理。

    synchronized的作用大概分为三种: 1.确保多线程互斥的访问多线程代码.2.保证变量的可见性.3.防止指令重排序. 那么synchronized 是如何实现这些功能的. public cla ...

  2. 洛谷P2424/codevs 2606 约数和

    http://codevs.cn/problem/2606/ https://luogu.lohu.info/problem/show?pid=2424 题目背景 Smart最近沉迷于对约数的研究中. ...

  3. [Luogu 3275] SCOI2011 糖果

    [Luogu 3275] SCOI2011 糖果 第一道差分约束.感谢 AZe. 我的理解是根据一些不等关系建一个图,在图上边跑一个最长路(有时候是最短路). 因为可能存在负环,所以必须用 SPFA! ...

  4. 苏宁OLAP架构设计

    一. 功能综述 OLAP引擎为存储和计算二合一的引擎,自身内部涵盖了对数据的管理以及提供查询能力.底层数据完全规划在引擎内部,外部系统不允许直接操作底层数据,而是需要通过暴露出来的接口来读写引擎内部数 ...

  5. markdown里的多层次列表项

    markdown里的多层次列表项 编写python的docstrng太多, 有时候就搞混淆了层次化列表项在博客或者随笔里的规则. docstirng里, 仅用两个空格的缩进就可以实现. 博客里通常是一 ...

  6. spring框架学习(五)整合JDBCTemplate

    1.导包 2.JdbcTemplate package cn.cnki.JdbcTemplate; import java.util.List; import org.junit.Test; impo ...

  7. 同一个IIS绑定多个Htts 站点问题

    默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTTPS只能更改IIS配置 地址:C:Windowssystem32inetsrvconfigapplicatio ...

  8. 【方法】纯jQuery实现星巴克官网导航栏效果

    前言 大冬天的没得玩,只能和代码玩. 所以就无聊研究了一下星巴克官网,在我看来应该是基本还原吧~ 请各位大神指教! 官网效果图 要写的就是最上方的会闪现的白色条条 效果分析 1.在滚动条往下拉到一定距 ...

  9. python入门 20141102-1405

    那Python有哪些缺点呢? 第一个缺点就是运行速度慢,和C程序相比非常慢, 第二个缺点就是代码不能加密. Python是解释型的 不是编译型的 Python解释器-CPython 命令行: 只需要在 ...

  10. 如何基于Spring Boot搭建一个完整的项目

    前言 使用Spring Boot做后台项目开发也快半年了,由于之前有过基于Spring开发的项目经验,相比之下觉得Spring Boot就是天堂,开箱即用来形容是绝不为过的.在没有接触Spring B ...