当前位置: 代码迷 >> 综合 >> SDUT 迷之好奇
  详细解决方案

SDUT 迷之好奇

热度:66   发布时间:2023-11-29 20:42:34.0

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
题解:这里输出的是几个前缀,但是前缀不好处理,所以我们想到了将她便为后缀,所以想到了reverse函数,将他村的时候反转过来,在存入的时候记录其有几个单词经过即可。
下面是AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=1e5+10;
int col[N];
int a[N][15];
int flag[N];
int k;
string s1,s2;
void Insert()
{
    int p=0,i;for(i=0;i<s1.size();i++){
    if(!a[p][s1[i]-'0']) a[p][s1[i]-'0']=++k;col[p]++;//记录几个单词经过了他。p=a[p][s1[i]-'0'];}flag[p]=1;//表示这是一个单词的末尾。
}
int search1()
{
    int p=0,i;for(i=0;i<s2.size();i++){
    if(!a[p][s2[i]-'0']) return 0;p=a[p][s2[i]-'0'];}return col[p];
}
int main()
{
    int n,m,i;ios::sync_with_stdio(false);while(cin>>n){
    for(i=1;i<=n;i++){
    cin>>s1;reverse(s1.begin(),s1.end());Insert();}cin>>m;for(i=1;i<=m;i++){
    cin>>s2;reverse(s2.begin(),s2.end());int num=search1();//找到单词段然后返回值。printf("%d\n",num);}memset(flag,0,sizeof(flag));memset(a,0,sizeof(a));memset(col,0,sizeof(col));k=0;//初始化。}return 0;
}

这道题本来的时候超时了,但加了一个 ios::sync_with_stdio(false) 减少时间的函数(输入量很大的时候且用cin的时候可以用)。