Submission #65260384


Source Code Expand

    #include <bits/stdc++.h>
   #include <atcoder/all>
    using namespace atcoder;
     
     
    // tabaicho see https://boostjp.github.io/tips/multiprec-int.html   
    // #include <boost/multiprecision/cpp_int.hpp>
     
    // using namespace boost::multiprecision;
     
    // cpp_int
    // int128_t
    // int256_t
    // int512_t
    // int1024_t
     
    // uint128_t
    // uint256_t
    // uint512_t
    // uint1024_t
     

     
  #define int long long
     #define inf  1000000007
    // #define inf  998244353
     
     #define pa pair<int,int>
     #define ppa pair<pa,pa>
     #define ll long long
     #define PI 3.14159265358979323846
     #define  mp make_pair
     #define  pb push_back
     #define EPS (1e-8)
     
          using namespace std;
                                              
     int dx[8]={1,0,-1,0,1,1,-1,-1};
     int dy[8]={0,-1,0,1,-1,1,1,-1};
                                                
    class pa3{
    	public:
    	int x;
    	int y,z;
    	pa3(int x=0,int y=0,int z=0):x(x),y(y),z(z) {}
    	bool operator < (const pa3 &p) const{
    		if(x!=p.x) return x<p.x;
    		if(y!=p.y) return y<p.y;
    		 return z<p.z;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator > (const pa3 &p) const{
    		if(x!=p.x) return x>p.x;
    		if(y!=p.y) return y>p.y;
    		 return z>p.z;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator == (const pa3 &p) const{
    		return x==p.x && y==p.y && z==p.z;
    	}
    		bool operator != (const pa3 &p) const{
    			return !( x==p.x && y==p.y && z==p.z);
    	}
    	pa3 operator + (pa3 p) {return pa3(x+p.x,y+p.y,z+p.z);}
    	pa3 operator - (pa3 p) {return pa3(x-p.x,y-p.y,z-p.z);}
     
    };
     
    class pa4{
    	public:
    	int x;
    	int y,z,w;
    	pa4(int x=0,int y=0,int z=0,int w=0):x(x),y(y),z(z),w(w) {}
    	bool operator < (const pa4 &p) const{
    		if(x!=p.x) return x<p.x;
    		if(y!=p.y) return y<p.y;
    		if(z!=p.z)return z<p.z;
    		return w<p.w;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator > (const pa4 &p) const{
    		if(x!=p.x) return x>p.x;
    		if(y!=p.y) return y>p.y;
    		if(z!=p.z)return z>p.z;
    		return w>p.w;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator == (const pa4 &p) const{
    		return x==p.x && y==p.y && z==p.z &&w==p.w;
    	}
    		
     
    };
    class pa2{
    	public:
    	int x,y;
    	pa2(int x=0,int y=0):x(x),y(y) {}
    	pa2 operator + (pa2 p) {return pa2(x+p.x,y+p.y);}
    	pa2 operator - (pa2 p) {return pa2(x-p.x,y-p.y);}
    	bool operator < (const pa2 &p) const{
    		return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator > (const pa2 &p) const{
    		return x != p.x ? x>p.x: y>p.y;
    	}
    	bool operator == (const pa2 &p) const{
    		return abs(x-p.x)==0 && abs(y-p.y)==0;
    	}
    	bool operator != (const pa2 &p) const{
    		return !(abs(x-p.x)==0 && abs(y-p.y)==0);
    	}
    		
     
    };
     
     
     
    string itos( int i ) {
    	ostringstream s ;
    	s << i ;
    	return s.str() ;
    }
     
    int Gcd(int v,int b){
    	if(v==0) return b;
    	if(b==0) return v;
    	if(v>b) return Gcd(b,v);
    	if(v==b) return b;
    	if(b%v==0) return v;
    	return Gcd(v,b%v);
    }
     
     
     
    int extgcd(int a, int b, int &x, int &y) {
        if (b == 0) {
            x = 1;
            y = 0;
            return a;
        }
        int d = extgcd(b, a%b, y, x);
        y -= a/b * x;
        return d;
    }
    pa operator+(const pa & l,const pa & r) {   
        return {l.first+r.first,l.second+r.second};                                    
    }    
    pa operator-(const pa & l,const pa & r) {   
        return {l.first-r.first,l.second-r.second};                                    
    }  
     
     
    pair<double,double> operator-(const pair<double,double> & l,const pair<double,double> & r) {   
        return {l.first-r.first,l.second-r.second};                                    
    }  
     
    ostream& operator<<(ostream& os, const vector<int>& VEC){
    	for(auto v:VEC)os<<v<<" ";
        return os;
    }
     
     ostream& operator<<(ostream& os, const pair<double,double>& PAI){
    	os<<PAI.first<<" : "<<PAI.second;
        return os;
    }
     
     
    ostream& operator<<(ostream& os, const pa& PAI){
    	os<<PAI.first<<" : "<<PAI.second;
        return os;
    }

    ostream& operator<<(ostream& os, const pa2& PAI){
    	os<<PAI.x<<", "<<PAI.y;
        return os;
    }
       
    ostream& operator<<(ostream& os, const pa3& PAI){
    	os<<PAI.x<<" : "<<PAI.y<<" : "<<PAI.z;
        return os;
    }
     
    ostream& operator<<(ostream& os, const pa4& PAI){
    	os<<PAI.x<<" : "<<PAI.y<<" : "<<PAI.z<<" : "<<PAI.w;
        return os;
    }
     
    ostream& operator<<(ostream& os, const vector<pa2>& VEC){
    	for(auto v:VEC)os<<v<<" ";
        return os;
    }
     
     
    ostream& operator<<(ostream& os, const vector<pa3>& VEC){
    	for(auto v:VEC){
    		os<<v<<" ";
    	os<<endl;
    	}
        return os;
    }
     
    int beki(int wa,ll rr,int warukazu){
    	if(rr==0) return 1%warukazu;
    	if(rr==1) return wa%warukazu;
    	wa%=warukazu;
    	if(rr%2==1) return ((ll)beki(wa,rr-1,warukazu)*(ll)wa)%warukazu;
    	ll zx=beki(wa,rr/2,warukazu);
    	return (zx*zx)%warukazu;
    }
     
     
                  
    int pr[3000302];
    int inv[3000302];
     
     
     
     
   const int mod=998244353;
//   const int mod=1000000007;
	const int inff=(1ll<<62)-1+(1ll<<62);
    int comb(int nn,int rr){
    	//if(nn==-1&&rr==-1)return 1;
    	if(rr<0 || rr>nn || nn<0) return 0;
    	int r=pr[nn]*inv[rr];
    	r%=mod;
    	r*=inv[nn-rr];
    	r%=mod;
    	return r;
    }
     
    void gya(int ert){
    	pr[0]=1;
    	for(int i=1;i<=ert;i++){
    		pr[i]=((ll)pr[i-1]*i)%mod;
    	}
    		inv[ert]=beki(pr[ert],mod-2,mod);
    	for(int i=ert-1;i>=0;i--){
    		inv[i]=(ll)inv[i+1]*(i+1)%mod;
    	}
    }
     
     
    int beki(int a,int b){
    	int ANS=1;
    	int be=a%mod;
    	while(b){
    		if(b&1){
    			ANS*=be;
    			ANS%=mod;
    		}
    		be*=be;
    		be%=mod;
    		b/=2;
    	}
    	return ANS;
    }
     
vector<int>zaatu(vector<int>vec){
	sort(vec.begin(),vec.end());
	vec.erase(unique(vec.begin(),vec.end()),vec.end());
	return vec;
}

     
struct unionfind{
	private:
	public:
	
	vector<int> par,ranks,kosuu;
	
	void shoki(int N){
		par.resize(N+1,0);
		ranks.resize(N+1,0);
		kosuu.resize(N+1,1);
		for(int i=0;i<=N;i++){
			par[i]=i;
		}
	}
	
	int root(int x){
		return par[x]==x ? x : par[x]=root(par[x]);
	}
	
	bool same(int x,int y){
		return root(x)==root(y);
	}
	bool is_root(int x){
		return x==root(x);
	}
	void unite(int x,int y){
		x=root(x);
		y=root(y);
		int xx=kosuu[x],yy=kosuu[y];
		if(x==y) return;
		if(ranks[x]<ranks[y]){
			par[x]=y;
			kosuu[y]=yy+xx;
		}
		else {
			par[y]=x;
			if(ranks[x]==ranks[y]) ranks[x]=ranks[x]+1;
			kosuu[x]=yy+xx;
		}
		return;
	}
};



                    
                  //   cin.tie(0);
        		//	ios::sync_with_stdio(false);
        			//priority_queue<pa3,vector<pa3>,greater<pa3>> pq;            
                     //sort(ve.begin(),ve.end(),greater<int>());
    //    mt19937(clock_per_sec);
      //  mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()) ;
     // a,b,c : positive int   a*b<=c  <=>  a<=c/b
     // a,b,c : positive int   a*b>c  <=>  a>c/b

// hightがdの頂点から生える子は数のdビット目を見る。葉のhightは-1
// root のhightは最大ビット数。dビット目が絶対0ならdでおk
typedef struct trie{
	
	int hight;
	int num;
	int killed;
	trie* child[26];
}trie;

int ANS=0;

trie* newtrie(int hight,int num){
	trie* TR=new trie;
	TR->hight=hight;
	TR->num=num;
	TR->killed=0;
	
	for(int i=0;i<26;i++)TR->child[i]=NULL;
	return TR;
}

void add_num(trie* root,string val){
	trie* node_now=root;
	for(auto c:val){
		int b=c-'a';
		node_now->num++;
		//if(node_now->hight==-1)break;
		if(node_now->child[b]==NULL){
			node_now->child[b]=newtrie(node_now->hight+1,0);
		}
		node_now=node_now->child[b];
		
	}
	return;
}


void add_num1(trie* root,string val){
	trie* node_now=root;
	bool cj=0;
	for(auto c:val){
		int b=c-'a';
		//node_now->num;
		//if(node_now->hight==-1)break;
		if(node_now->child[b]==NULL){
			node_now->child[b]=newtrie(node_now->hight+1,0);
		}
		node_now=node_now->child[b];
		if(node_now->killed){
			cj=1;
			break;
		}
	}
	if(cj)return;
	node_now->killed=1;
	int kesu=node_now->num;
	ANS-=kesu;
	
	
	node_now=root;
	for(auto c:val){
		int b=c-'a';
		node_now->num-=kesu;
		node_now=node_now->child[b];
	}
	node_now->num-=kesu;
	return;
}

void add_num2(trie* root,string val){
	trie* node_now=root;
	bool cj=0;
	for(auto c:val){
		int b=c-'a';
		//node_now->num
		//if(node_now->hight==-1)break;
		if(node_now->child[b]==NULL){
			node_now->child[b]=newtrie(node_now->hight+1,0);
		}
		node_now=node_now->child[b];
		if(node_now->killed){
			cj=1;
			break;
		}
	}
	if(cj)return;
	ANS++;
	
	
	node_now=root;
	for(auto c:val){
		int b=c-'a';
		node_now->num++;
		node_now=node_now->child[b];
	}
	node_now->num++;
	return;
}


void solve(){
	trie* R=newtrie(0,0);
	int Q;
	cin>>Q;
	while(Q--){
		int t;
		cin>>t;
		string s;
		cin>>s;
		if(t==1){
			add_num1(R,s);
		}
		else{
			add_num2(R,s);
		}
		cout<<ANS<<endl;
	}
}

    
    signed main(){
    	//mod=inf;
    	//mae();
   	cin.tie(0);
    	ios::sync_with_stdio(false);
    	int n=1;
    //cin>>n;
    	for(int i=0;i<n;i++){
    		solve();
    	}
    	return 0;
    	
    }



Submission Info

Submission Time
Task E - Forbidden Prefix
User smiken
Language C++ 20 (gcc 12.2)
Score 500
Code Size 10034 Byte
Status AC
Exec Time 214 ms
Memory 121496 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 2
AC × 57
Set Name Test Cases
Sample 00_sample_01.txt, 00_sample_02.txt
All 00_sample_01.txt, 00_sample_02.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 01_random_40.txt, 01_random_41.txt, 02_handmade_01.txt, 02_handmade_02.txt, 02_handmade_03.txt, 02_handmade_04.txt, 02_handmade_05.txt, 02_handmade_06.txt, 02_handmade_07.txt, 02_handmade_08.txt, 02_handmade_09.txt, 02_handmade_10.txt, 02_handmade_11.txt, 02_handmade_12.txt, 02_handmade_13.txt, 02_handmade_14.txt
Case Name Status Exec Time Memory
00_sample_01.txt AC 1 ms 3552 KiB
00_sample_02.txt AC 1 ms 3688 KiB
01_random_01.txt AC 62 ms 120812 KiB
01_random_02.txt AC 61 ms 120680 KiB
01_random_03.txt AC 69 ms 120700 KiB
01_random_04.txt AC 65 ms 120664 KiB
01_random_05.txt AC 61 ms 120624 KiB
01_random_06.txt AC 81 ms 120668 KiB
01_random_07.txt AC 53 ms 120404 KiB
01_random_08.txt AC 49 ms 109608 KiB
01_random_09.txt AC 51 ms 91444 KiB
01_random_10.txt AC 40 ms 68120 KiB
01_random_11.txt AC 52 ms 107868 KiB
01_random_12.txt AC 40 ms 73652 KiB
01_random_13.txt AC 61 ms 118100 KiB
01_random_14.txt AC 214 ms 3612 KiB
01_random_15.txt AC 201 ms 3640 KiB
01_random_16.txt AC 206 ms 3596 KiB
01_random_17.txt AC 107 ms 3788 KiB
01_random_18.txt AC 205 ms 3660 KiB
01_random_19.txt AC 20 ms 32092 KiB
01_random_20.txt AC 2 ms 3672 KiB
01_random_21.txt AC 27 ms 6040 KiB
01_random_22.txt AC 46 ms 92948 KiB
01_random_23.txt AC 31 ms 4972 KiB
01_random_24.txt AC 186 ms 3720 KiB
01_random_25.txt AC 128 ms 3712 KiB
01_random_26.txt AC 141 ms 3764 KiB
01_random_27.txt AC 89 ms 17560 KiB
01_random_28.txt AC 182 ms 3600 KiB
01_random_29.txt AC 107 ms 3612 KiB
01_random_30.txt AC 148 ms 3736 KiB
01_random_31.txt AC 93 ms 3996 KiB
01_random_32.txt AC 119 ms 3840 KiB
01_random_33.txt AC 40 ms 6152 KiB
01_random_34.txt AC 166 ms 3564 KiB
01_random_35.txt AC 120 ms 3904 KiB
01_random_36.txt AC 131 ms 3700 KiB
01_random_37.txt AC 193 ms 7836 KiB
01_random_38.txt AC 166 ms 33448 KiB
01_random_39.txt AC 150 ms 52252 KiB
01_random_40.txt AC 138 ms 64656 KiB
01_random_41.txt AC 128 ms 73436 KiB
02_handmade_01.txt AC 75 ms 121420 KiB
02_handmade_02.txt AC 73 ms 121496 KiB
02_handmade_03.txt AC 204 ms 3408 KiB
02_handmade_04.txt AC 204 ms 3560 KiB
02_handmade_05.txt AC 24 ms 3412 KiB
02_handmade_06.txt AC 24 ms 3448 KiB
02_handmade_07.txt AC 5 ms 3604 KiB
02_handmade_08.txt AC 6 ms 3612 KiB
02_handmade_09.txt AC 5 ms 4224 KiB
02_handmade_10.txt AC 5 ms 4036 KiB
02_handmade_11.txt AC 30 ms 9576 KiB
02_handmade_12.txt AC 15 ms 9400 KiB
02_handmade_13.txt AC 59 ms 62416 KiB
02_handmade_14.txt AC 65 ms 62412 KiB