https://ac.nowcoder.com/acm/contest/4370/B
判断是否有数是另一个数的前缀,字典树模板。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
typedef struct node{
bool flag;
int CNT=0;
int next_s[10];
}tire;
tire a[100010];
char s[11];
int cnt;
void init(){
cnt=0;
a[0].flag=false;
memset(a[0].next_s,-1,sizeof(a[0].next_s));
a[0].CNT=0;
}
bool Insert(){
int id=0;
for(int i=0;s[i];i++){
if(a[id].next_s[s[i]-'0']==-1){
if(a[id].flag)return false;//
a[id].next_s[s[i]-'0']=++cnt;
id=cnt;
a[cnt].flag=false;
a[id].CNT=1;
memset(a[cnt].next_s,-1,sizeof(a[cnt].next_s));
}
else {
id=a[id].next_s[s[i]-'0'];
a[id].CNT++;
}
}
a[id].flag=true;
//是否出现过
if(a[id].CNT>1)return false;
else return true;
}
int main(){
int t,n,num;
int Case=0;
scanf("%d",&t);
while(t--){
init();
bool flag=true;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",s);
if(flag&&Insert())
;
else flag=false;
}
if(flag)printf("Case #%d: Yes\n",++Case);
else printf("Case #%d: No\n",++Case);
}
return 0;
}