消灭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;
}