大佬求调QAQ
查看原帖
大佬求调QAQ
866154
fcy20180201楼主2023/11/28 22:39

WA 70,用 Trie 树做的。

#include<bits/stdc++.h>
using namespace std;
int n,q,sn[200005][26],cnt[200005],sum;
char s[25];
unordered_map<int,bool>mp;

int query(){
	int cur=0;
	for(int i=1;s[i];i++){
		if(!sn[cur][s[i]-'a'])return 0;
		cur=sn[cur][s[i]-'a'];
	}
	int x=(mp[cur]?0:cnt[cur]);
	mp[cur]=true;
	return x;
}

int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%s",s);
		int cur=0;
		for(int i=0;s[i];i++){
			if(!sn[cur][s[i]-'a'])sn[cur][s[i]-'a']=++sum;
			cur=sn[cur][s[i]-'a'];
		}
		cnt[cur]++;
	}
	while(q--){
		mp.clear();
		for(int i=0;i<20;i++)s[i]=0;
		scanf("%s",s+1);
		if(query()){
			puts("-1");
			continue;
		}
		n=strlen(s+1);
		char c=s[1];
		int ans=0;
		for(int i=1;i<=n;s[i]=c,i++,c=s[i])for(char j='a';j<='z';j++)s[i]=j,ans+=query();
		c=0;
		for(int i=n;i;i--)swap(s[i],c),ans+=query();
		for(int i=1;i<=n;i++)swap(c,s[i]);
		for(c='a';c<='z';c++){
			s[n+1]=c;
			for(int i=n;i;i--)ans+=query(),swap(s[i],s[i+1]);
			ans+=query();
			for(int i=1;i<=n;i++)swap(s[i],s[i+1]);
		}
		printf("%d\n",ans);
	}
	return 0;
}
2023/11/28 22:39
加载中...