Cod sursa(job #3296575)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 14 mai 2025 06:19:25
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct T
{
	char c;
	int n,p,s,b;
}t[5200001];
char w[21];
int main()
{
	for(int v,z=0;cin>>v;) {
		cin.getline(w,21);
        int l=strlen(w);
        if(v>2) {
            int r=0;
            for(int i=1,j=1,k=0;i<l&&j;++r,k=j,++i)
                for(j=t[k].s;j&&(t[j].c!=w[i]||!t[j].p);j=t[j].b);
            cout<<r-1<<'\n';
		} else if(v>1) {
		    int j=1;
		    for(int i=1,k=0;i<l&&j;k=j,++i)
                for(j=t[k].s;j&&(t[j].c!=w[i]||!t[j].p);j=t[j].b);
		    cout<<(j?t[j].n:0)<<'\n';
		} else if(v) {
		    bool o=1;
		    for(int i=1,k=0;i<l&&o;++i)
                for(int j=t[k].s;j&&o;j=t[j].b)
                    if(t[j].c==w[i]&&(--t[j].p,k=j,i>l-2))
                        --t[j].n,o=0;
		} else {
		    bool g=1;
		    for(int h=0,i=1,k=0;i<l&&g;++i) {
                bool f=1;
                for(int j=t[k].s;j&&f&&g;j=t[j].b)
                    if(t[j].c==w[i]) {
                        if(++t[j].p,k=j,f=0,i>l-2)
                            ++t[j].n,g=0;
                    } else
                        h=j;
                if(f&&g)
                    t[++z].c=w[i],t[z].n=i>l-2,t[z].p=1,t[k].s?t[h].b=z:t[k].s=z,k=z;
		    }
		}
	}
	return 0;
}