3/22 补题

CF 1285D Trie+贪心

一点通2.3的变体,第一眼看成原题。。。

01trie上贪心 很裸的题

进阶版2.3例题里面有一堆。。。。不过当年做的加强版是这样的(可持久化Trie+贪心)

//#define LOCAL
#include <cstring>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <bitset>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdio>
using namespace std;
#define X_mem(x,y,z) (X_mem[x][y][z] ? X_mem[x][y][z] :X_mem[x][y][z]=mem(x,y,z))
// X_INIT=0  mem_Macro
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define FOR(i,j,k) for(int i=j;i<k;i+=1)
#define FORD(i,j,k) for(int i=j;i>k;i-=1)
#define uLL unsigned long long
#define LL long long
#define SZ(x) int(x.size())
#define pb push_back
#define maxnode 5000010
#define maxsize 2
int t,ans;
int a[100010];
struct Trie10{
    int ch[maxnode][maxsize];
    int lr[maxnode][2];
    //int r[maxnode];
    int sz;
    void init(){
        sz=1;memset(ch[0],0,sizeof(ch[0]));//memset(val,0,sizeof(val));
    }
    void insert(int x){
        int u=0;
        FORD(i,30,-1){
            int c=(x>>i)&1;
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                memset(lr[sz],0,sizeof(lr[sz]));
                ch[u][c]=sz++;
            }
            lr[u][c]++;
            u=ch[u][c]; 
        }
        return;
    }
    int query(int cnt,int dep){
        if(dep>=0){
            if(lr[cnt][1]==0) return query(ch[cnt][0],dep-1);
            else if(lr[cnt][0]==0) return query(ch[cnt][1],dep-1);
            else return (1<<(dep-1))+min(query(ch[cnt][1],dep-1),query(ch[cnt][0],dep-1));
        }
        return 0;
    }
};
int main(){
#ifdef LOCAL
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
scanf("%d",&t);
Trie10 tt;
tt.init();
ans=0;
FOR(i,0,t){
    scanf("%d",&a[i]);
    tt.insert(a[i]); 
}
//FOR(i,0,t)
ans=(tt.query(1,30));
printf("%d\n",ans);
//system("pause");
#ifdef LOCAL
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
ac代码

HDU 2222

八方向ac自动机裸题。

因为我写的ac自动机是加了路径压缩的,所以毫无疑义地炸了空间。。。。不想写原版的了。。。等我把后缀数组学了再回来补吧。。。

贴个板子

#define maxnode 1000010
#define maxsize 26
struct ahocT{
    int ch[maxnode][maxsize];
    int e[maxnode],fail[maxnode];
    int sz;
    void init(){
        sz=1;memset(ch[0],0,sizeof(ch[0]));memset(e,0,sizeof(e));return;
    }
    int idx(char c) {return c-'a';}
    void insert(char *x){
        int u=0,len=strlen(x);
        FOR(i,0,len){
            int c=idx(x[i]);
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                ch[u][c]=sz++;  
            }
            u=ch[u][c];
        }
        e[u]++;
        return;
    }
    void build(){
        int u;
        queue<int> q;
        memset(fail,0,sizeof(fail));
        FOR(i,0,26)
        if(ch[0][i]) q.push(ch[0][i]);
        while(!q.empty()){
            u=q.front();q.pop();
            FOR(i,0,26){
                if(ch[u][i]) {
                    fail[ch[u][i]]=ch[fail[u]][i];
                    q.push(ch[u][i]);
                }
                else ch[u][i]=ch[fail[u]][i];
            }
        }
        return;
    }
    int query(char *x){
        int ans=0,c=0,len=strlen(x);
        FOR(i,0,len){
            c=ch[c][idx(x[i])];
            for(int j=c;c&&~e[c];j=fail[j]) ans+=e[j],e[j]=-1;
        }
        return ans;
    }
};
板子

猜你喜欢

转载自www.cnblogs.com/mukoiaoi/p/12546289.html