TLE 求助,我写了假的记忆化吗?蒟蒻疑惑
查看原帖
TLE 求助,我写了假的记忆化吗?蒟蒻疑惑
362627
frank15楼主2021/4/15 18:56
#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#define bug puts("----------")
using namespace std;
const int maxn=2e6+5;
int n,m;
string a;
int cnt;
bool vis[maxn];
struct t{
	int nex[30],visit;
}tree[maxn];
map<string,int> mp;
void qinsert(string s){
	int p=0;
	for(int i=0;i<s.size();i++){
		int c=s[i]-'a';
		if(!tree[p].nex[c])
			tree[p].nex[c]=++cnt;
		p=tree[p].nex[c];
	}
	tree[p].visit=1;
	return ;
}
int qfind(string s){
	if(mp.find(s)!=mp.end())
		return mp[s];
	int len=s.size(),ans=-1,p=0;
	fill(vis,vis+len+1,0);
	for(int i=0;i<len;i++){
		int c=s[i]-'a';
		if(!tree[p].nex[c])
			break;
		p=tree[p].nex[c];
		if(tree[p].visit)
			vis[i]=1;
	}
	for(int i=0;i<len;i++)
		if(vis[i]){
			ans=i;
			p=0;
			for(int j=i+1;j<len;j++){
				int c=s[j]-'a';
				if(!tree[p].nex[c])
					break;
				p=tree[p].nex[c];
				if(tree[p].visit)
					vis[j]=1;
			}
		}
	mp[s]=ans+1;
	return ans+1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		cin>>a;
		qinsert(a);
	}
	for(int i=1;i<=m;i++){
		cin>>a;
		cout<<qfind(a)<<endl;
	}
	return 0;
} 
2021/4/15 18:56
加载中...