我又回来了
查看原帖
我又回来了
1019257
zhaojiawei1234444楼主2024/7/11 15:29

P3879

有没有dalao提下建议,我该怎样才能实现找出字符串出处的操作,悬棺

这是我的代码

#include<bits/stdc++.h>
using namespace std;
const int N=1000050;
int trie[N][70];
int cnt[N];
int id;
string s;
int n,l,m;
void insert(string s){
	int p=0;
	for(int i=0;i<s.size();i++){
		/*
			a~b 0~25
			A~b 26~51
			0~9 52~61
		*/
		int x;
		if(s[i]>='A'&&s[i]<='Z'){
			x=s[i]-'A'+26;
		}else if(s[i]>='a'&&s[i]<='z'){ 
			x=s[i]-'a';
		}else if(s[i]>=0&&s[i]<=9){
			x=s[i]+52;
		}
		if(trie[p][x]==0)trie[p][x]=++id;
		p=trie[p][x];
	}
	cnt[p]++;
}

int find(string s){
	int p=0;
	int ans[1010];
	for (int i = 0; i < s.size(); i++){
		int x;
		if(s[i]>='A'&&s[i]<='Z'){
			x=s[i]-'A'+26;
		}else if(s[i]>='a'&&s[i]<='z'){ 
			x=s[i]-'a';
		}else if(s[i]>=0&&s[i]<=9){
			x=s[i]+52;
		}
		if(trie[p][x]==0)return 0;
		p=trie[p][x];
	}
	return 1;
//}
//void where(string s){
//	int p=0;
//	int ans[1010];
//	for (int i = 0; i < s.size(); i++){
//		int x;
//		if(s[i]>='A'&&s[i]<='Z'){
//			x=s[i]-'A'+26;
//		}else if(s[i]>='a'&&s[i]<='z'){ 
//			x=s[i]-'a';
//		}else if(s[i]>=0&&s[i]<=9){
//			x=s[i]+52;
//		}
//		if(trie[p][x]==0)return 0;
//		p=trie[p][x];
//	}
//	return 1;	
//}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>l;
		for(int j=1;j<=l;j++){
			cin>>s;
			insert(s);		
		}

	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>s;
		if(find(s)){
			
		}
		else cout<<"\n";
	}
	cout<<endl<<endl;
	
}
/*



*/
2024/7/11 15:29
加载中...