CF 1285D Trie+贪心
一点通2.3的变体,第一眼看成原题。。。
01trie上贪心 很裸的题
进阶版2.3例题里面有一堆。。。。不过当年做的加强版是这样的(可持久化Trie+贪心)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//#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 ",ans); //system("pause"); #ifdef LOCAL fclose(stdin); fclose(stdout); #endif return 0; }
HDU 2222
八方向ac自动机裸题。
因为我写的ac自动机是加了路径压缩的,所以毫无疑义地炸了空间。。。。不想写原版的了。。。等我把后缀数组学了再回来补吧。。。
贴个板子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; } };
update:
突然发现炸空间是因为query函数写炸了。。。草。。。
补题ing