洛谷P8306,memset这个数组是20分,forAC,memset初始化整个数组慢我理解,但即使向memset第三个值不传sizeof...,而是计算好要初始化的地方,还是没for快,按理来说应该是memset快呀。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int trie[3000010][65];
int cnt[3000010];
int idx;

int hx(char x)
{
	if(x >= 'A' && x <= 'Z')
	{
		return x-'A';
	}
	else if(x >= 'a' && x <= 'z')
	{
		return x-'a'+26;
	}
	else if(x >= '0' && x <= '9')
	{
		return x-'0'+52;
	}
}

void insert(string s)
{
	int p = 0;
	int l = s.size();
	for(int i = 0; i < l; i++)
	{
		int j = hx(s[i]);
		if(!trie[p][j])
		{
			trie[p][j] = ++idx;
		}
		p = trie[p][j];
		cnt[p]++;
	}
}

ll query(string s)
{
	int p = 0;
	int l = s.size();
	ll sum = 0;
	for(int i = 0; i < l; i++)
	{
		int j = hx(s[i]);
		if(!trie[p][j])
		{
			return 0;
		}
		p = trie[p][j];
	}
	return cnt[p];
}

int main()
{
	int T;
	cin >> T;
	while(T--)
	{
		//这是最快的 
		for(int i = 0; i <= idx; i++)
		{
			cnt[i] = 0;
			for(int j = 0; j < 65; j++)
			{
				trie[i][j] = 0;
			}
		}
		
		//这是最慢的 
		//memset(trie, 0, sizeof trie);
		//memset(cnt, 0, sizeof cnt);
		
		//这个竟然比for还慢 
		//memset(trie, 0, sizeof(int)*idx*65);
		//memset(cnt, 0, sizeof(int)*idx);
		
		idx = 0;
		int n,q;
		cin >> n >> q;
		for(int i = 0; i < n; i++)
		{
			string t;
			cin >> t;	
			insert(t);
		}	
		for(int i = 0; i < q; i++)
		{
			string t;
			cin >> t;
			cout << query(t) << endl;
		}
	}	
	
	return 0;
}

2 comments

  • @ 2024-11-19 21:12:11

    #include<bits/stdc++.h> using namespace std;

    int main() { double A; cin >> A; if (A > 0)<<count A<<endl;

    else if(A == 0)<<count A<<endl;
    
    else <<count -A<<endl;
    return 0;
    

    } //求解分支第2题

    • @ 2024-11-17 18:11:57

      已解决,是for优化了,memset没有,还是memset快,但不要用memset初始化整个大数组,只初始化要用了就行,第三个参数无脑填sizeof...会死的很惨

      • 1