首页 > 其他分享 >求求求求求原题自动机

求求求求求原题自动机

时间:2024-07-26 14:29:58浏览次数:13  
标签:std 求求 原题 int res mid zc fa 自动机

来个原题自动机看看我这份双 \(\log\) 代码能不能过原题。

#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
inline int read(){char ch=getchar();int x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);return x*f;}
const int N=1e5+10;
int n,m,q,fa[N],size[N],root[N],cnt;
std::vector<int>son[N];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
struct TREE{
    int ls,rs,ans;
}t[N<<6];
inline void update(int p){
    if(t[t[p].ls].ans==t[t[p].rs].ans){
        t[p].ans=t[t[p].ls].ans;
    }else{
        t[p].ans=-1;
    }
    return;
}
inline void build(int p,int l,int r){
    if(l==r){t[p].ans=l;return;}
    int mid=l+r>>1;
    build(t[p].ls=++cnt,l,mid);
    build(t[p].rs=++cnt,mid+1,r);
    update(p);
}
inline int query(int p,int l,int r,int x,int y){
    if(l>=x&&r<=y){return t[p].ans;}
    int mid=l+r>>1,res=0;
    if(x<=mid){
        int zc=query(t[p].ls,l,mid,x,y);
        if(!res){res=zc;}
        else if(res!=zc){res=-1;}
    }
    if(y>mid){
        int zc=query(t[p].rs,mid+1,r,x,y);
        if(!res){res=zc;}
        else if(res!=zc)res=-1;
    }
    return res;
}
inline void insert(int p,int l,int r,int last,int pos,int x){
    if(l==r){t[p].ans=x;return;}
    int mid=l+r>>1;
    t[p]=t[last];
    if(pos<=mid){
        insert(t[p].ls=++cnt,l,mid,t[last].ls,pos,x);
    }
    else{
        insert(t[p].rs=++cnt,mid+1,r,t[last].rs,pos,x);
    }
    update(p);
}
inline void add(int x,int y,int k){
    x=find(x),y=find(y);
    if(x==y){root[k]=root[k-1];return;}
    if(son[x].size()>son[y].size())std::swap(x,y);
    fa[x]=y;
    int last=k-1;
    for(int it:son[x]){
        son[y].push_back(it);
        fa[it]=find(it);
        cnt++;
        int zc=cnt;
        insert(zc,1,n,root[last],it,fa[it]);
        root[k]=zc;
        last=k;
    }son[x].clear();
}
inline void look(int p,int l,int r){
    if(l==r){
        std::cout<<t[p].ans<<' ';
        return;
    }
    int mid=l+r>>1;
    look(t[p].ls,l,mid);
    look(t[p].rs,mid+1,r);
}
signed main(){
	// freopen("in.in","r",stdin);freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
	n=read(),m=read(),q=read();
    for(int i=1;i<=n;++i)fa[i]=i,son[i].push_back(i);
    root[0]=++cnt;
    build(root[0],1,n);
	for(int i=1;i<=m;++i){
        int x=read(),y=read();
        add(x,y,i);
    }
    for(int i=1;i<=q;++i){
        int x=read(),y=read();
        int l=0,r=m,ans=0;
        while(l<=r){
            int mid=l+r>>1;
            if(query(root[mid],1,n,x,y)!=-1)r=mid-1,ans=mid;
            else l=mid+1;
        }
        std::cout<<ans<<'\n';
    }
}

标签:std,求求,原题,int,res,mid,zc,fa,自动机
From: https://www.cnblogs.com/Ishar-zdl/p/18325293

相关文章

  • SA & SAM 后缀数组 & 后缀自动机
    终于来到大名鼎鼎的后缀结构了,后缀结果可以解决许多子串问题。后缀结果是字符串经常考察的点,需要重点学习。SA后缀排序,是指这个对字符串\(s\)的每一个后缀字符串进行排序,通过处理每个后缀的前缀来解决子串问题。\(SA\):排名为\(i\)对应原字符串下标,\(rk\):下标为\(i\)的后缀排名。......
  • 序列自动机
    序列自动机判断字符串\(s\)是否存在序列\(t\)。只需要记录这个位置,后面每个字符出现的最早位置即可\(nxt\)。求子序列个数记忆化搜索\(f[x]=\underset{y\inx'son}{\sum}f[y]+1\)求两串的公共子序列个数两个串的记忆化搜搜\(f[x][y]\)例题:luogu:P5826【模板】......
  • AC自动机
    即在trie上kmp。AC自动机是一种多模式串匹配算法,用于在一个文本串中查找多个模式串。注意到,AC自动机的\(fail\)也构成了一个树形结构。我们只需要在操作完进行一个离线拓扑排序就不用每次匹配到一个点,暴力跑完所有fail确认是哪些模式串。structAC{vector<int>end[MAXN];......
  • P3041 [USACO12JAN] Video Game G 题解 AC自动机
    本题是一道AC自动机上的dp。首先不难想到状态定义f(i,j)表示仅考虑前i 个位置,第i 个字符是j 的分数,但无法转移,所以考虑将j这一维转化为表示AC自动机上的点。再定义val(i)表示以i 结尾的所有技能种数,则转移方程为f(i,j)=max(f(i,j),f(i-1,father(j)+val(j......
  • 自动机
    简介自动机是一种通过状态之间的跳转进行计算的数学模型。当自动机接受一个输入字符时,它使用状态转移函数,依据当前所处的状态和输入的字符跳转至下一个状态。我们常常使用有向图表示一个有限状态自动机。此时,状态在有向图上以结点形式表示;状态转移函数表示为这张图上的有向边的......
  • 自动机
    自动机,就是对于每一个状态和给出的元素,可以唯一确定下一个转移的一个模型比如判断一个二进制数的奇偶性,这是一个很难的问题,用正常思路基本解决不了,只有巨佬才能不要自动机解决,我只有用自动机才能勉强明白定义状态\(p_0\)表示考虑完读入的这一部分末尾0为0个的......
  • 真的求求点赞+关注+收藏了!!(c++小游戏3)(还有其它的)
    13、球球大作战//奇怪的游戏#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;voidpass(){CONSOLE_CURSOR_INFOcursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}intjj......
  • 求个点赞关注啦!!!!!!!!!!!求求啦!!!!!!!?
    下面是一些游戏代码!#include<stdio.h>#include<iostream>#include<time.h>#include<conio.h>#include<windows.h>   #include<stdlib.h>     #include<string.h> usingnamespacestd; constintn=809; stru......
  • 【密码学】从有限状态自动机到密钥流生成器
        本文是对流密码内容的拓展,在流密码中种子密钥通过一个伪随机数生成器产生一个与明文等长的伪随机密钥流。而本文的内容就是在回答这样两个问题:伪随机密钥流是如何生成的?流密码、流密钥生成器和有限状态自动机之间是什么关系?一、什么是有限状态自动机?(1)定义  ......
  • [题解]细胞自动机
    给定一个长度为\(n\)的\(01\)串\(s\),用于表示一个环上的细胞的初始状态,其中第\(1\)个细胞与第\(2\)个、第\(n\)个细胞相邻;第\(n\)个细胞与第\(1\)个和第\(n-1\)个相邻。\(0\)表示细胞死亡,\(1\)表示细胞存活。接下来给定\(t\)轮操作,每一轮操作,根据上一轮细胞的状态更改此轮的状态。......