社区讨论

蒟蒻的AC被卡掉了

P1184高手之在一起参与者 7已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mk89u50g
此快照首次捕获于
2026/01/10 20:18
2 个月前
此快照最后确认于
2026/01/13 21:25
2 个月前
查看原帖
AC做这道题有很多麻烦啊
字符串中间有空格,而且数据量貌似可能会炸掉AC(他没说字符串长度)
蒟蒻实在懒得改代码了,求救(轻点骂)
CPP
#include<bits/stdc++.h>
using namespace std;
const int MAXN=9000010;

int n, m;
string s, t;

struct Edge{
	int v,la;
};Edge edge[MAXN];
int head[MAXN];

int trie[MAXN][28];
int cnt;
int End[MAXN];
int pass[MAXN];

int fail[MAXN];

int box[MAXN];
bool vis[MAXN];

void trie_insert(int snow,string ins);
void make_fail( );
void add(int u,int v);
void pushup( );
char AC_change(char c);

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> m;
	for(int i=1 ; i<=n ; i++){
		cin >> t;
		trie_insert(i,t);
	}
	for(int i=1 ; i<=m ; i++){
		cin >> t;
		s+=t;
	}
	
	make_fail( );
	
	int len=s.size();
	int now=0;
	for(int i=0,path ; i<len ; i++){
		now=trie[now][s[i]-'A'];
		pass[now]++;
	}
	
	for(int i=1 ; i<=cnt ; i++){
		add(fail[i],i);
	}
	
	pushup( );
	
	int ans=0;
	for(int i=1 ; i<=n ; i++){
		ans+=pass[End[i]];
	}
	
	cout << ans << '\n';
	
	return 0;
}

void make_fail( ){
	int l=0, r=0;
	for(int i=0 ; i<26 ; i++){
		if(trie[0][i]!=0) box[r++]=trie[0][i];
	}
	int now;
	while(l<r){
		now=box[l++];
		for(int i=0 ; i<26 ; i++){
			if(trie[now][i]==0)
				trie[now][i]=trie[fail[now]][i];
			else {
				fail[trie[now][i]]=trie[fail[now]][i];
				box[r++]=trie[now][i];
			}
		}
	}
	return ;
}

void pushup( ){
	int r=0; int now=0;
	box[r++]=now;
	while(r>0){
		now=box[r-1];
		if(!vis[now]){
			vis[now]=true;
			for(int i=head[now] ; i ; i=edge[i].la){
				box[r++]=edge[i].v;
			}
		}
		else {
			r--;
			for(int i=head[now] ; i ; i=edge[i].la){
				pass[now]+=pass[edge[i].v];
			}
		}
	}
	return ;
}

void trie_insert(int snow,string ins){
	int now=0;
	int len=ins.size();
	for(int i=0,path ; i<len ; i++){
		path=ins[i]-'A';
		if(trie[now][path]==0){
			trie[now][path]=++cnt;
		}
		now=trie[now][path];
	}
	End[snow]=now;
	return ;
}

void add(int u,int v){
	edge[v].v=v;
	edge[v].la=head[u];
	head[u]=v;
	return ;
}

char AC_change(char c){
	if(c=='#') return 27;
	if(c==' ') return 26;
	else return c-'A';
}

回复

6 条回复,欢迎继续交流。

正在加载回复...