为什么我用trie爆搜(前后搜)会wa最后一个点?(没有TLE)
查看原帖
为什么我用trie爆搜(前后搜)会wa最后一个点?(没有TLE)
794715
zhang20091227楼主2024/12/12 20:18
#include<bits/stdc++.h>
//#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
int const N=15e6+5;
int trie[N][29],cnt,pos[N];
void insert(string s){
	int u=0,l=s.length();
	for(int i=0;i<l;i++){
		int idx=s[i]-'A';
		if(trie[u][idx]==0){
			trie[u][idx]=++cnt;
		}
		u=trie[u][idx];
	}
	pos[u]++;
}
bool query(string s){
	int u=0,l=s.length();
	for(int i=0;i<l;i++){
		int idx=s[i]-'A';
		if(trie[u][idx]==0)
			return 0;
		u=trie[u][idx];
	}
	if(pos[u])
		return 1;
	return 0;
}
struct node{
	int l,r;//[ , ]
	node(int y=0,int o=0):l(y),r(o){};
};
node blc[N];
int ct=0;
string s2;
int l,r;
int lt;
void check(int x){
	r=x,l=x;
	int cct=-1;
	while(l>0){
		string s4(s2,l,r-l+1);
		if(!query(s4))
		{
			if(ct-(++cct)>0)
			l=blc[ct-(cct)].l;
			else {
				l=-1;
				break;
			}
		}
		else break;
	}
	if(l<=0){
		r=x,l=x,cct=0;
		while(r<=lt){
			string s4(s2,l,r-l+1);
			if(!query(s4)){
				r++;
			}
			else break;
		}
	}
}
int ans;
int main(){
//	freopen("a.in","r",stdin);
//	freopen("a1.out","w",stdout);
	IOS;
	blc[0]=node(-1,-1);
	while(true){
		string s1;
		cin>>s1;
		if(s1[0]=='.')
			break;
		insert(s1);
	}
	string sy;
	while(cin>>sy){
		s2+=sy;
	}
	lt=s2.length();
	s2='#'+s2;
	for(int i=1;i<=lt;i++){
		check(i);
		if(l<=0||r>lt){
			cout<<ans;
			return 0;
		}
		else{
			blc[++ct]=node(l,r);
			ans=r;
			i=r;
		}
	}
	cout<<ans;
	return 0;
}

用块来保存左边的可以向前回溯的范围,向右无法回溯,直接r++

2024/12/12 20:18
加载中...