[USACO12JAN]Video Game G【AC自动机+DP】

“Can a man still be brave if he’s afraid?”
“That is the only time a man can be brave.”

每天六点多起床,整理好寝室内务后就去图书馆研读论文和处理邮件,完成后开vue写前端准备项目,中途还要跑去做核酸和水军理课,因为组上项目的事迟到了两次军训了,九点结束后疲惫地赶往图书馆改改改,改完基本接近闭馆,回寝室刷一两道ACM题,写写有的没的博客,半死不活地倒在床上,而这也是平常的一天,本应如此……

Why do you think I came all this way?

为什么,看见了她的照片,为什么,她笑得那么开心,为什么,我为她的快乐也感到快乐
总是这样
总是这样,每次都是
我会窥见自己内心的阴暗面,我其实想的是
为什么,她家境那么好,为什么,她那么天生丽质,为什么,她能从小一路名校受到那么好的教育
我怎么配追一个各方面碾压自己的女孩,只凭两人涉世未深时那些单纯愉快的交谈?本就不是同一个世界的人,本就不是
我是不是,还可以更努力一点?
不,爱是理性的死亡,那么理性同样可以是爱的死亡
这么多年,武汉大学里,在正式开学前就主动联系教授并成功加入项目组的学生,我是第一个,这并不是值得高兴的事,与其说是上进,不如说是来自久远岁月的自卑作祟。
自从艾斯黛拉与皮普于废墟间重逢,我已迷失太久
我安静地看着周围,女孩子恋爱脑,男孩子精虫上脑;我又向里面看,浅薄、做作、失礼、自以为是的自己
我厌恶的不是庸俗的喧嚣,而是不能超脱其中的自己
我已无数次试图逃离
无数的泪水,方才构成我们的世界,你听见了吗,从东边天空升起的世界
一生用追寻来掩饰逃离,失败后又靠臆想舔舐伤痕
我出生于贫困的山林
我最重要的哥哥在我眼前死去
我最擅长的折纸是小时候为了摆摊卖钱补贴家用被迫所学
我仅仅考上个985就成了全乡里的谈资……
其实上高中后,家里经济状况渐渐也好转了,足以让我带着R7000来学校了。可是,为了一口水走几公里外打水的记忆,是再多可乐奶茶也淹没不了的
地球有七十亿人,有人能告诉我吗
为什么,哥哥会死啊,为什么,我力气那么小,没能拉哥哥上来啊,为什么,我的故乡那么闭塞,没能救回哥哥啊
为什么,那么多年了,偏偏今晚情绪再也控制不住了
我至今清晰地记得哥哥从强装镇定安抚我,到虚弱至极却不放弃希望的眼神,直到最终在黑暗中安静下来的空洞瞳孔…………
我后来也意识到,我从未从那晚黛青色的暮光里走出来,那段惨剧已经刻进我的灵魂,我像是上了发条的人偶,向着前方跌跌撞撞
上了发条的人偶吗?这个比喻,好像还不错
我是不会停下来的
因为在那个晚上,在凝视哥哥发散的瞳孔时,我就已经没把自己当活着了
中国十几亿人,没有谁会关注一个悲惨的农村家庭,也没有谁会留意一个心浮气躁的大一新生
更没有人会知道,他曾经多么相信考上名校就可以改写命运,到头来,却发现什么都没改变
就如他没人会看的博客,已经都快沦落成日记本了呵_
弗洛伊德说,人是同时崇尚生存与死亡的存在
我所理解的死亡,是在某个安静的傍晚,独自走在河畔,夕阳落红染赤了粼粼波光,和风正好,芦苇摇曳,于是我坐下,对自己说,啊,我要死在这了
在等到那遥远的夕阳前,还是挺起胸膛吧,没有什么比赶路更能让人忘却曾经
\(AC\)自动机上跳\(fail\)统计答案即可,常规\(DP\),毕竟\(trie\)图的\(DP\)都大同小异的

$Why$ $do$ $you$ $think$ $I$ $came$ $all$ $this$ $way$
# include "bits/stdc++.h"
using namespace std;
constexpr int N = 1003;
struct Ahio_Corasick_Automation {
    struct node {
        int ch[3], fail, tot;
    } t[N]; // hey, guys. I found that writing structure is more elegent and happy :)
    int trie_index;
    void insert(char *str) {
        int len = strlen(str + 1), u = 0;
        for(int i = 1; i <= len; ++i) {
            int v = str[i] - 'A';
            if(!t[u].ch[v]) t[u].ch[v] = ++trie_index;
            u = t[u].ch[v];
        }
        ++t[u].tot;
    }
    void build() {
        queue<int> q;
        for(int i = 0; i < 3; ++i) {
            if(t[0].ch[i]) {
                q.push(t[0].ch[i]);
            }
        }
        while(!q.empty()) {
            int u = q.front();
            q.pop();
            for(int i = 0; i < 3; ++i) {
                int &v = t[u].ch[i];
                if(v) {
                    t[v].fail = t[t[u].fail].ch[i];
                    q.push(v);
                }
                else {
                    v = t[t[u].fail].ch[i];
                }
            }
            t[u].tot += t[t[u].fail].tot; // save the time from jumping fail
        }
    }
} AC;
char str[N];
int main() {
    int n, K;
    scanf("%d%d", &n, &K);
    for(int i = 1; i <= n; ++i) {
        scanf("%s", str + 1);
        AC.insert(str);
    }
    AC.build();
    
    vector f(K + 1, vector<int>(AC.trie_index + 1, -0x3f3f3f3f));
   	f[0][0] = 0;
    for(int i = 1; i <= K; ++i) {
        for(int j = 0; j <= AC.trie_index; ++j) {
            for(int k = 0; k < 3; ++k) {
                f[i][AC.t[j].ch[k]] = max(f[i][AC.t[j].ch[k]], f[i - 1][j] + AC.t[AC.t[j].ch[k]].tot);
            }
        }
    }
    int ans = -0x7fffffff;
    for(int i = 0; i <= AC.trie_index; ++i) {
        ans = max(ans, f[K][i]);
    }
    printf("%d", ans);
    return 0;
}

image

posted @ 2022-08-24 03:15  邱涵的秘密基地  阅读(49)  评论(0编辑  收藏  举报