B - 迷之好奇
Description
FF得到了一个有n个数字的集合。不要问我为什么,有钱,任性。
FF很好奇的想知道,对于数字x,集合中有多少个数字可以在x前面添加任意数字得到。
如,x = 123,则在x前面添加数字可以得到4123,5123等。
Input
多组输入。
对于每组数据
首先输入n(1<= n <= 100000)。
接下来n行。每行一个数字y(1 <= y <= 100000)代表集合中的元素。
接下来一行输入m(1 <= m <= 100000),代表有m次询问。
接下来的m行。
每行一个正整数x(1 <= x <= 100000)。
Output
对于每组数据,输出一个数字代表答案。
Sample
Input
3 12345 66666 12356 3 45 12345 356
Output
1 0 1
Hint
字典树的题,注意要倒序,写的用数组的代码会tle,改链表会快很多
TLE代码:
#include <bits/stdc++.h>
using namespace std;
const int Manx=1e5+10;
//const int side=26;
int trie[Manx][11]={0};
int color[Manx]={0};
int k;
int search(int root,char a[]){
int len=strlen(a),n;
for(int i=len-1;i>=0;i--){
n=a[i]-'0';
if(trie[root][n]==0) return 0;
root=trie[root][n];
}
return color[root];
}
void insert(int root,char a[]){
int len=strlen(a);
int n;
for(int i=len-1;i>=0;i--){
n=a[i]-'0';
if(trie[root][n]==0){
trie[root][n]=++k;
}
color[root]++;
root=trie[root][n];
}
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
char a[20];
while(cin>>n){
k=0;
for(int i=0;i<n;i++){
cin>>a;
insert(0,a);
}
cin>>m;
for(int i=0;i<m;i++){
cin>>a;
cout<<search(0,a)<<endl;
}
}
return 0;
}
AC代码:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10
#define MAXN 123456
struct node
{
int data;
struct node * next[MAX];
};
struct node Tree[MAXN];
int top;
struct node * creat()
{
struct node *p= &Tree[top++];
for(int i=0;i<MAX;i++)
p->next[i]=NULL;
p->data = 0;
return p;
};
struct node * Initial()
{
top = 0;
return creat();
};
void Insert(struct node * root, char * s)
{
struct node * p = root;
int len = strlen(s);
for(int i=len-1;i>=0;i--)//倒序
{
int t = s[i] - '0';
if(p->next[t]==NULL)
p->next[t] = creat();
p->data++;//稍稍修改
p = p->next[t];
}
}
int Find(struct node* root, char *s)
{
struct node * p =root;
int len = strlen(s);
for(int i=len-1;s[i];i--)//倒序
{
int t = s[i] - '0';
if(p->next[t]==NULL)
return 0;
p = p->next[t];
}
return p->data;
}
int main()
{
char s1[MAXN], s2[MAXN];
int n, m;
while(~scanf("%d", &n))
{
top = 0;
struct node * root;
root = (struct node *)malloc(sizeof(struct node));
root = Initial();
while(n--)
{
scanf("%s", s1);
Insert(root, s1);
}
scanf("%d", &m);
while(m--)
{
scanf("%s", s2);
printf("%d\n", Find(root, s2));
}
}
return 0;
}