警示后人
查看原帖
警示后人
414386
Isshiki·Iroha楼主2021/7/16 21:39

消灭char暴政 世界属于string!

这是T的找不到马的代码


#include<bits/stdc++.h>
#define reg register
using namespace std;
const int maxn=2e6+5;
struct node {
	int s[27],fail;
} ac[maxn];
int die[maxn];
int n,cnt=0;
int head[maxn],siz[maxn];
struct node1 {
	int v,nxt;
} kano[maxn];
int tot=0;
void add_kano(reg int u,reg int v) {
	tot++;
	kano[tot].nxt=head[u];
	kano[tot].v=v;
	head[u]=tot;
}
void build(reg char *a,reg int sign) {
	reg int la=strlen(a),u=0;
	for(reg int i=0; i<la; i++) {
		reg int c=a[i]-'a'+1;
		if(!ac[u].s[c]) {
			ac[u].s[c]=++cnt;
		}
		u=ac[u].s[c];
	}
	die[sign]=u;
}
void pre() {
	queue<int>q;
	for(reg int i=1; i<=26; ++i) {
		if(ac[0].s[i]!=0) {
			ac[ac[0].s[i]].fail=0;
			q.push(ac[0].s[i]);
		}
	}
	while(!q.empty()) {
		reg int u=q.front();
		q.pop();
		for(reg int i=1; i<=26; i++) {
			if(ac[u].s[i]) {
				ac[ac[u].s[i]].fail=ac[ac[u].fail].s[i];
				q.push(ac[u].s[i]);
			} else ac[u].s[i]=ac[ac[u].fail].s[i];
		}
	}
}
void Chtholly(reg int u) {
	for(reg int i=head[u]; i; i=kano[i].nxt) {
		Chtholly(kano[i].v);
		siz[u]+=siz[kano[i].v];
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin>>n;
	reg char s[maxn];
	for(reg int i=1; i<=n; i++) {
		cin>>s;
		build(s,i);
	}
	pre();
	cin>>s;
	for(reg int i=0,u=0; i<strlen(s); i++) {
		u=ac[u].s[s[i]-'a'+1];
		siz[u]++;
	}
	for(reg int i=1; i<=cnt; i++)add_kano(ac[i].fail,i);
	Chtholly(0);
	for(reg int i=1; i<=n; i++)  
		cout<<siz[die[i]]<<endl;
	return 0;
}

这是AC代码,仅仅把所有char改成了string


#include<bits/stdc++.h>
#define reg register
using namespace std;
const int maxn=2e6+5;
struct node {
	int s[27],fail;
} ac[200005];
int die[200005];
int cnt=0;
int head[200005],siz[200005];
struct node1 {
	int v,nxt;
} kano[200005];
int tot=0;
void Chtholly(reg int u) {
	for(reg int i=head[u]; i; i=kano[i].nxt) {
		Chtholly(kano[i].v);
		siz[u]+=siz[kano[i].v];
	}
}
void add_kano(reg int u,reg int v) {
	tot++;
	kano[tot].nxt=head[u];
	kano[tot].v=v;
	head[u]=tot;
}
inline void build(reg string a,reg int sign) {
	reg int la=a.length(),u=0;
	for(reg int i=0; i<la; i++) {
		reg int c=a[i]-'a'+1;
		if(!ac[u].s[c]) {
			ac[u].s[c]=++cnt;
		}
		u=ac[u].s[c];
	}
	die[sign]=u;
}
void pre() {
	queue<int>q;
	for(reg int i=1; i<=26; ++i) {
		if(ac[0].s[i]!=0) {
			ac[ac[0].s[i]].fail=0;
			q.push(ac[0].s[i]);
		}
	}
	while(!q.empty()) {
		reg int u=q.front();
		q.pop();
		for(reg int i=1; i<=26; i++) {
			if(ac[u].s[i]) {
				ac[ac[u].s[i]].fail=ac[ac[u].fail].s[i];
				q.push(ac[u].s[i]);
			} else ac[u].s[i]=ac[ac[u].fail].s[i];
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	reg string s;
	for(reg int i=1; i<=n; i++) {
		cin>>s;
		build(s,i);
	}
	pre();
	cin>>s;
	for(reg int i=0,u=0; i<s.length(); i++) {
		u=ac[u].s[s[i]-'a'+1];
		siz[u]++;
	}
	for(reg int i=1; i<=cnt; i++)add_kano(ac[i].fail,i);
	Chtholly(0);
	for(reg int i=1; i<=n; i++)
		cout<<siz[die[i]]<<endl;
	return 0;
}
2021/7/16 21:39
加载中...