68pts求调,指针做法
查看原帖
68pts求调,指针做法
940854
Jianbing_Juan楼主2023/10/1 20:54

rt.

感激不尽!

我是用指针来做的。虽然常数大,但还是能勉强过的。(C语言返祖写法,不符合周礼)

但是就是不知道到底为什么WA了啊...

好像前两个点特别毒瘤。(评测记录)

源代码:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;

struct Node
{
	Node * next[64];
	int down_cnt;
};

typedef Node * Trie,** pTrie;

inline int trans(char ch)
{
	if(ch>='A' and ch<='Z')
	return ch-'A';
	if(ch>='a' and ch<='z')
	return ch-'a'+26;
	return ch-'0'+52;
}

inline Trie init_Trie(void)
{
	return (Trie)calloc(1,sizeof(Node));
}

inline void add(const char * str,Trie trie)
{
	Trie ptr=trie;
	int len=strlen(str);
	for(int i=0;i<=len;i++)//ptr 指向第 i 层  
	{
		
		if(ptr->next[trans(str[i])]==nullptr)
		{
			ptr->next[trans(str[i])]=init_Trie();
		}
		ptr=ptr->next[trans(str[i])];
		ptr->down_cnt++;
	}
}

inline void search(const char str[],Trie trie)
{
	int len=strlen(str);
	Trie ptr=trie;
	for(int i=0;i<len;i++)
	{
		ptr=ptr->next[trans(str[i])];
		if(ptr==nullptr)
		{
			cout<<0<<endl;
			return;
		}
	}
	cout<<ptr->down_cnt<<endl;
}

void free_Trie(Trie trie)
{
	if(trie==nullptr)
	return;
	for(int i=0;i<64;i++)
	{
		free_Trie(trie->next[i]);
	}
	free(trie);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen("P8306_1.in","r",stdin);
	//freopen("aaa.out","w",stdout);
	int t,n,q,cnt=0;
	string str;
	cin>>t;
	while(t--)
	{
		Trie trie=init_Trie();
		cin>>n>>q;
		while(n--)
		{
			cin>>str;
			add(str.c_str(),trie);
		}
		while(q--)
		{
			cnt++;
			cin>>str;
			search(str.c_str(),trie);
		}
		free_Trie(trie);
	}
	
	
}
2023/10/1 20:54
加载中...