全RE求调(数组开小也以一样)
查看原帖
全RE求调(数组开小也以一样)
766275
IAKIOI2020楼主2023/12/19 17:08
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int n,m;
struct tire{int ch[27],num,fail;bool flag;}t[N]; int cnt;
void insert(string s,int id){
	int now=0,len=s.size();
	for(int i=0;i<len;i++){
		int v=s[i]-'a';
		if(!t[now].ch[v]) t[now].ch[v]=++cnt;
		now=t[now].ch[v];
	}
	t[now].num=id;
	return;
}
queue<int>q;
void get_fail(){
	for(int i=0;i<26;i++) if(t[0].ch[i]) t[t[0].ch[i]].fail=0,q.push(t[0].ch[i]);
	while(!q.empty()){
		int u=q.front(); q.pop();
		for(int i=0;i<26;i++){
			int v=t[u].ch[i];
			if(!v) t[u].ch[i]=t[t[u].fail].ch[i];
			else t[v].fail=t[t[u].fail].ch[i],q.push(v);
 		}
	}
	return;
}
void query(string s){
	int len=s.size(),now=0;
	for(int i=0;i<len;i++){
		now=t[now].ch[s[i]-'a'];
		int v=now;
		for(;v;v=t[v].fail){
			if(t[v].flag) break;
			t[v].flag=1;
		}
	}
	return;
}
string s,tt[100010];
int main(){
	cin>>n>>m;
	cin>>s;
	for(int i=1;i<=m;i++){
		cin>>tt[i];
		insert(tt[i],i);
	}
	get_fail();
	query(s);
	for(int kj=1;kj<=m;kj++){
		int now=0,len=tt[kj].size(),ans=0;
		for(int i=0;i<len;i++){
			int v=tt[kj][i]-'a';
			now=t[now].ch[v];
			if(t[now].flag) ans=i+1;
		}
		cout<<ans<<endl;
	}
	return 0;
}
2023/12/19 17:08
加载中...