首页 > 其他分享 >CF1163D Mysterious Code ACA+DP

CF1163D Mysterious Code ACA+DP

时间:2022-10-28 10:34:12浏览次数:53  
标签:ACA ch val int CF1163D fail Mysterious dp


将两个串插入AC自动机,AC自动机带点权,S串带权值1,T串带权值-1,对树在构建时求树上点权前缀和,然后设表示到的第个字符,在ACA上的第个节点时的答案,那么就有转移方程:

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

const int N = 2e5 + 10, M = 26, MOD = 1e9 + 7;

#define mp(x) (x -'a')


namespace ACA{
int ch[N][M], fail[N], ed[N], val[N];
int sz;
void init() {
sz = 1;
memset(ch[0], 0, sizeof(ch));
}

void insert(const string &s, int id, int v) {
int n = s.size(), u = 0, c;
for(int i = 0; i < n; i++) {
c = mp(s[i]);
if(!ch[u][c]) {
memset(ch[sz], 0, sizeof(ch[sz]));
ch[u][c] = sz++;
}
u = ch[u][c];
}
ed[u] = id, val[u] += v;
}

void build() {
queue<int> Q;
fail[0] = 0;
for(int c = 0, u; c < M; c++) {
u = ch[0][c];
if(u) { Q.emplace(u); fail[u] = 0; }
}
while(!Q.empty()) {
int r = Q.front(); Q.pop();
for(int c = 0, u; c < M; c++) {
u = ch[r][c];
if(!u) {
ch[r][c] = ch[fail[r]][c];
continue;
}
fail[u] = ch[fail[r]][c];
Q.emplace(u);
}
val[r] += val[fail[r]];
}
}

}


using ACA::val;

int dp[1010][110];

inline void solve(){
string c, s, t; cin >> c >> s >> t;
ACA::init();
ACA::insert(s, 0, 1), ACA::insert(t, 0, -1), ACA::build();
memset(dp, -0x3f, sizeof(dp));
dp[0][0] = 0;
for(int i = 0; i < c.size(); i++) {
for(int j = 0; j <= ACA::sz; j++) {
for(int k = 0; k < 26; k++) {
if(c[i] == '*' || c[i] - 'a' == k) {
int id = ACA::ch[j][k];
dp[i + 1][id] = max(dp[i + 1][id], dp[i][j] + val[id]);
}
}
}
}
int ans = -1e9;
for(int i = 0; i <= ACA::sz; i++) ans = max(ans, dp[c.size()][i]);
cout << ans << endl;
}

signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
cout << fixed << setprecision(12);
int t = 1; // cin >> t;
while(t--) solve();
return 0;
}


标签:ACA,ch,val,int,CF1163D,fail,Mysterious,dp
From: https://blog.51cto.com/u_12372287/5803554

相关文章

  • CF1358D The Best Vacation
    题目传送门思路做这道题主要是需要发现一个性质:选择的区间必定是从某一个月的最后一天开始往前连续的一段区间。考虑如何证明这个结论,设这个月有\(x\)天,假设有更优的......
  • 【题解】The 2021 ICPC Asia Macau Regional Contest - E Pass The Ball
    问题描述解释相当于给定一个置换群,求\(\sum\limits_{i=1}^{n}i*b_{i}\)题目分析本题这种传球的关系显然是存在循环节的,先考虑一个大小为\(m\)的环,显然我们可以用......
  • Macad3d的编译
    Macad3d编译的条件比较苛刻地址:https://github.com/Macad3D/Macad3DVS2022VisualStudio2022:需要安装.net桌面开发,C++桌面开发,.net6组件,C++/CLI支持组件,最后一......
  • Python: Facade Pattern
    DuFacade.pyimportosimportreimportthreading#外观模式FacadePatternclass_IgnitionSystem(object):@staticmethoddefproduce_spark():......
  • 设计模式 -- Facade(门面模式)
    门面模式(Facade)系统间耦合的复杂度对于客户系统和子系统之前存在很多的耦合的情况,如果不考虑设计的情况,那么会形成A方案的情况,系统的依赖严重,维护性大大降低。如果在......
  • CSharp: Facade Pattern in donet core 3
     ///<summary>///外观模式FacadePattern///geovindu,GeovinDueidt///机器人颜色///</summary>publicclassRobotColor{......
  • SYACALL_DEFINE系统调用
    Linux的系统调用在内核中的入口函数都是sys_xxx,但是我们在内核源码去搜索时,无法找到sys_xxx的函数定义,这是因为Linux的系统调用对应的函数全部都是由SYSCALL_DEFINE......
  • GuavaCache中LoadingCache的使用
    背景LoadingCache是GuavaCache构建缓存实体的方法,是一个支持多线程并发读写、高性能、通用的in-heap(堆)本地缓存。支持key不存在时按照给定的CacheLoader的loader方法......
  • CSharp: Facade Patterns
     ///<summary>///SummarydescriptionforDBTable.///外观模式FacadePatterns///20220918///geovindu,GeovinDu,涂聚文///</summ......
  • 题解【CF1307F Cow and Vacation】
    感觉CF*3300的难度没有这么简单吧(题目传送门。考虑\(\texttt{Bessie}\)运动的过程:起点\(\to\)休息点$\to$\(\cdots\)\(\to\)休息点\(\to\)终点。考虑我们......