题目:poj3630
题意:寻找前缀是否是其他字符串
解答:
静态建树!
这个静态的树怎么建立的呢?
1、定义一个节点,并且定义节点数组表示这课树上的所有节点。节点的一个变量terminal表示该节点是否是一个字符串的最后一个。另一个节点son[10]表示该节点的儿子们的下标。
2、建立一棵树,bool ans表示是否成立,ptr表示这个树的下标,从0开始~
3、插入一个字符串,定义一个当前下标now,每次now从0开始。bool t1,t2表示导致结果为假的两个因素。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 100000;
int base = '0',ptr;
bool ans;
struct node
{
bool terminal;
int son[10];
};
node arr[MAXN];
void Init()
{
ptr = 0;
ans = true;
for(int i = 0;i < 100000;i++)
{
arr[i].terminal = false;
for(int j = 0;j < 10;j++)
arr[i].son[j] = -1;
}
}
void Insert(char *s,int len)
{
bool t1 = false;
bool t2 = false;
int now = 0;
for(int i = 0;i < len;i++)
{
if(arr[now].son[s[i]-base] == -1)
{
t1 = true;
arr[now].son[s[i]-base] = ++ptr;
now = ptr;
}
else
{
now = arr[now].son[s[i]-base];
if(arr[now].terminal == true)
t2 = true;
}
}
arr[now].terminal = true;
ans = t1 && (!t2);
}
int main()
{
int T,n;
char a[11];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
Init();
while(n--)
{
scanf("%s",a);
if(ans) Insert(a,strlen(a));
}
if(ans)
printf("YES\n");
else
printf("NO\n");
}
}