View Code of Problem 3201

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 300000;
int Tire[maxn][10];
bool v[maxn];
char st[10010][15];
int cnt = 1;
//建树,每输入一个单词到 s 里面就调用_insert()就好
void _insert(int t){
 	int root = 0;
 	for(int i=0;st[t][i];i++){
 		int next = st[t][i] - '0';
 		if(!Tire[root][next])
 			Tire[root][next] = ++cnt;
 		root = Tire[root][next];
 	}
 	v[root] = true;//这里用了一个标记数组表示该点存在一个完整的单词,比如说`app`和`apple`
}
int _find(char bufs[]){
 	int root = 0;
 	int next;
 	for(int i=0;bufs[i];i++){
 		next = bufs[i] - '0';
 		root = Tire[root][next];
// 		cout<<bufs[i]<<endl;
		if(v[root]&&i!=strlen(bufs)-1){
			return 0;
		}
 			
 	}
 	return 1;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		bool flag=true;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			scanf("%s",&st[i]);
			_insert(i);
		}
		for(int i=0;i<n;i++){
            if(_find(st[i]))
				continue;
            flag=0;
			break;
        }
		if(flag)
			printf("YES\n");
        else
			printf("NO\n");	
		memset(Tire,0,sizeof(Tire));
		memset(v,0,sizeof(v));
		cnt=0;
	}
	
	return 0;
}

Double click to view unformatted code.


Back to problem 3201