12.21闲话

推歌

一梦千宵

漫步在 没来过 的街巷

灯火下 看人潮 多熙攘

原来是 过节了 要换装

楼阁也挂满彩帐

买一串 糖葫芦 先尝尝

再挑个 俏铃铛 戴手上

不远处 说书人 开了嗓

约上谁 捧捧场

莺歌蝶舞韶光长

红炉煮茗松花香

旧时华彩今又唱

一夜花灯漾

明宵梦长

借漫天的 烟火斑斓

连同霄灯 许下期盼

只要身边 有你陪伴

往后时光 绝不遗憾

就算世界 太多美好 只一眨眼 就变幻

可回忆 始终璀璨

这一侧 台上谁 起花腔

那一边 又几人 捏面糖

你赶忙 招呼我 少张望

别傻傻跟丢地方

猜是那 仙人们 也一样

会牵手 趁热闹 逛市坊

听海风 徐徐吹 心摇晃

做宵灯 把它放

莺歌蝶舞韶光长

红炉煮茗松花香

旧时华彩今又唱

一夜花灯漾

你我之间 无数牵绊

像这首歌 越唱越暖

哪怕有天 终将分散

相同旅程 也未孤单

就让故事 随着旋律 轻轻地哼 飘天畔

永远都 不会断

一盏一盏 一闪一闪

从手中升起飞去 彼岸

汇成星路一段

牵引迷途的人 启帆

心中的愿 不会暗淡

借漫天的 烟火斑斓

连同霄灯 许下期盼

只要身边 有你陪伴

往后时光 绝不遗憾

就算世界 太多美好 只一眨眼 就变幻

可回忆 始终璀璨

那些一时擦肩而过 错开的你我

也许仍沿相对方向 朝未来穿梭

终有天在某处相遇 最熟悉轮廓

依然是 如此闪烁

今天大概给高一大佬讲了一下题和知识点

首先是链式前向星的相关知识

大佬不止不会链式前向星,甚至不会衔接矩阵讲起来好麻烦

这让我想起了一位树剖边权转点权解法是对于每个点建立3条边的故人

TA懂了链式前向星顺手教了TA传说中的STL容器

然后自己学了学pbds的那几个容器,pbds强强强但是我感觉不如手写Hash和平衡树

其次是给大佬跳题让他意识到getchar会读入'\n'和' '非常有成就感

不过很可惜作为废物的我在学完AC自动机之后我仍然只会打一道板子题,OJ上的第二道我便没看出来

我估计是AC自动机掌握的不够好,那么就又去找了几篇看起来不错的博客

画了几张图研究了一下

稍微搞懂一些感觉好多了

然后就是写了道AC自动机(就是OJ上第二道题QAQ)

病毒

可以rand骗分

多模式串明显AC自动机,我们可以发现正常的AC自动机是去文本串里匹配模式串但是本题明显不是这样的,而本题却希望在文本串里不要出现模式串

想要找到一个无限长的01串可以明显得出需要在AC自动机形成的字典图里面找环,这个环不包含任何一个字符串的末尾同时需要能被根节点访问到

找环直接DFS就行

$My\ Code$
#include<bits/stdc++.h>
using namespace std;
namespace IO{
    inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
    inline void Fire(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
    inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
    inline void write(int x){char F[200];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}if(cnt==0)putchar('0');while(cnt>0)putchar(F[--cnt]);putchar(' ');}
}
using namespace IO;
class AC{
public:
    class Trie{
    public:
        int fail,vis[2],end; 
    }Tr[1000000];
    int cnt=1; 
    inline void ins(string s){

        int l=s.length(),q=1;
        for(int i=0;i<l;++i){
            if(!Tr[q].vis[s[i]-'0']) 
                Tr[q].vis[s[i]-'0']=++cnt;
            q=Tr[q].vis[s[i]-'0']; 
        }
        Tr[q].end=1;

    }
    inline void Get(){
        queue<int>Q; 
        Q.push(1);
        Tr[0].vis[0]=Tr[0].vis[1]=1;
        while(!Q.empty()){
            int u=Q.front();
            Q.pop();
            for(int i=0;i<2;++i){
                if(Tr[u].vis[i]){
                    Q.push(Tr[u].vis[i]);
                    int t=Tr[u].fail;
                    while(t && !Tr[t].vis[i])
                        t=Tr[t].fail;
                    Tr[Tr[u].vis[i]].fail=Tr[t].vis[i];
                    Tr[Tr[u].vis[i]].end|=Tr[Tr[t].vis[i]].end;
                }
                else
                    Tr[u].vis[i]=Tr[Tr[u].fail].vis[i];
            }
        }
    }
    // inline int Ask(string s){
    //     int l=s.length(),q=0,ans=0;
    //     for(int i=0;i<l;++i){
    //         q=Tr[q].vis[s[i]-'a'];
    //         for(int t=q;t&&Tr[t].end!=-1;t=Tr[t].fail){
    //             ans+=Tr[t].end;
    //             Tr[t].end=-1;
    //         } 
    //     }
    //     return ans;
    // }
}AC;
bool vis[1000000],inss[1000000];
bool dfs(int x){
    inss[x]=vis[x]=1;
    int y;
    for(int i=0;i<2;i++){
        y=AC.Tr[x].vis[i];
        if(inss[y]||(!vis[y]&&!AC.Tr[y].end&&dfs(y)))
            return 1;
    }
    inss[x]=0;
    return 0;
}
signed main(){
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    string s;
    int m=read();
    for(int i=1;i<=m;++i){
        cin>>s;
        AC.ins(s);
    }
    AC.Get();
    puts(dfs(1)?"TAK":"NIE");
}

posted @ 2023-12-21 21:12  Vsinger_洛天依  阅读(20)  评论(1编辑  收藏  举报