求助,代码时间超限,请大佬帮看看

锦姐姐作为魔法少女有很多魔法石,每个魔法石都有一个符文,符文是一个数字。 
锦姐姐想知道她拥有某一种魔法石的数量。 

 

输入

第一行输入一个数t,代表有t组数据 
每组数据的第一行输入两个数n,q,代表n个魔法石,q次询问 
接下来一行n个整数ai,表示每个魔法石的符文 
接下来q行,每行一个数x,代表符文为x 
数据范围:1<=t<=100,1<=n<=100000,1<=q<=1000,0<=ai<=100000,0<=x<=100000

输出

每组输出q行 
每行输出符文为x的魔法石的个数 

样例输入Copy

1
5 2
1 1 2 2 3
2
3

样例输出Copy

2
1

我的代码

#include<stdio.h>

int a[100005];

int main()

{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        int i,n,q,x;

        scanf("%d %d",&n,&q);

        for(i=0;i<n;i++)

            scanf("%d",&a[i]);

            while(q--)

            {

                int temp=0;

                scanf("%d",&x);

                for(i=0;i<n;i++)

                {

                    if(a[i]==x)

                        temp+=1;

                }

                printf("%d\n",temp);

            }

    }

    return 0;

}

请问这种的该如何优化呢

我帮你改良了一下,试试我这个代码

#include<stdio.h>
#include<string.h>
int a[100001];
int main()
{
    int t,i,n,q,x,y;
    scanf("%d",&t);
    while(t--)
    {
		memset(a,0,sizeof(a));
        scanf("%d %d",&n,&q);
        for(i=0;i<n;i++)
		{
            scanf("%d",&y);
			a[y]++;
		 }
            while(q--)
            {
                scanf("%d",&x);
                printf("%d\n",a[x]);
            }
    }
    return 0;
}

 

这道题应该用哈希最快。用一个数组存每个符文出现的次数。给楼上的大佬补充一下问题。

不一定所有a[i]都在n以内,所以保证装得下的话,数组a的长度最小应为100001。