记一下数组+node实现+封装的新板子
http://acm.hdu.edu.cn/showproblem.php?pid=2222
#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
int casn,n,m;
const int csize=26,minc='a';
class autom{public:
#define nd node[now]
struct acnode{int cnt,son[csize],fail;}node[maxn];
int sz=0;
void clear(int n=maxn-5){
memset(node,0,sizeof(acnode)*n);
sz=0;
}
void insert(char *s,int len){
int now=0;
rep(i,0,len-1){
int ch=s[i]-minc;
if(!nd.son[ch]) nd.son[ch]=++sz;
now=nd.son[ch];
}
node[now].cnt++;
}
void init(){
queue<int> que;
int now=0;
rep(i,0,csize-1) if(nd.son[i])
que.push(nd.son[i]);
while(!que.empty()){
now=que.front();que.pop();
rep(i,0,csize-1){
if(nd.son[i]) {
node[nd.son[i]].fail=node[nd.fail].son[i];
que.push(nd.son[i]);
}else nd.son[i]=node[nd.fail].son[i];
}
}
}
int query(char *t,int len){
int now=0,res=0;
rep(i,0,len-1) {
now=nd.son[t[i]-minc];
for(int j=now;j&&node[j].cnt!=-1;j=node[j].fail)
res+=node[j].cnt,node[j].cnt=-1;
}
return res;
}
}acam;
char s[maxm];
int main(){IO;
cin>>casn;
while(casn--){
cin>>n;
acam.clear();
rep(i,1,n){
cin>>s;
acam.insert(s,strlen(s));
}
acam.init();
cin>>s;
cout<<acam.query(s,strlen(s))<<endl;
}
}
http://acm.hdu.edu.cn/showproblem.php?pid=2896
#include <bits/stdc++.h>
#define endl '\n'
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
#pragma GCC optimize("Ofast")
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<"="<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double PI=acos(-1.0);
//head
int casn,n,m;
const int csize=128,minc=0;
class autom{public:
#define nd node[now]
struct acnode{int id,son[csize],fail;}node[maxn];
int sz=0;
queue<int> que;
void clear(int n=maxn-5){
memset(node,0,sizeof(acnode)*n);
sz=0;
}
void insert(int id,char *s,int len=0){
if(!len)len=strlen(s);
int now=0;
rep(i,0,len-1){
int ch=s[i]-minc;
if(!nd.son[ch]) nd.son[ch]=++sz;
now=nd.son[ch];
}
nd.id=id;
}
void init(){
int now=0;
rep(i,0,csize-1) if(nd.son[i])
que.push(nd.son[i]);
while(!que.empty()){
now=que.front();que.pop();
rep(i,0,csize-1){
if(nd.son[i]) {
node[nd.son[i]].fail=node[nd.fail].son[i];
que.push(nd.son[i]);
}else nd.son[i]=node[nd.fail].son[i];
}
}
}
vector<int> query(char *t,int len=0){
if(!len)len=strlen(t);
int now=0;
vector<int> ans;
rep(i,0,len-1) {
now=nd.son[t[i]-minc];
for(int j=now;j;j=node[j].fail)
if(node[j].id)ans.push_back(node[j].id);
}
return ans;
}
}acam;
vector<int> ans;
char s[maxm];
int main(){IO;
cin>>n;
rep(i,1,n) {
cin>>s;
acam.insert(i,s);
}
acam.init();
cin>>m;
int cnt=0;
rep(i,1,m){
cin>>s;
vector<int>ans=acam.query(s);
sort(all(ans));
int num=unique(all(ans))-ans.begin();
if(ans.size()){
cout<<"web "<<i<<":";
rep(i,0,num-1) cout<<' '<<ans[i];
cout<<endl;
cnt++;
}
}
cout<<"total: "<<cnt<<endl;
}
http://acm.hdu.edu.cn/showproblem.php?pid=3065
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
#pragma GCC optimize("Ofast")
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<"="<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double PI=acos(-1.0);
//head
int casn,n,m;
const int csize=128,minc=0;
int cnt[maxn];
class autom{public:
#define nd node[now]
struct acnode{int id,son[csize],fail;}node[maxn];
int sz=0;
queue<int> que;
void clear(){
memset(node,0,sizeof(acnode)*(sz+1));
sz=0;
}
void insert(int id,char *s,int len=0){
if(!len)len=strlen(s);
int now=0;
rep(i,0,len-1){
int ch=s[i]-minc;
if(!nd.son[ch]) nd.son[ch]=++sz;
now=nd.son[ch];
}
nd.id=id;
}
void init(){
int now=0;
rep(i,0,csize-1) if(nd.son[i])
que.push(nd.son[i]);
while(!que.empty()){
now=que.front();que.pop();
rep(i,0,csize-1){
if(nd.son[i]) {
node[nd.son[i]].fail=node[nd.fail].son[i];
que.push(nd.son[i]);
}else nd.son[i]=node[nd.fail].son[i];
}
}
}
void count(int now){
while(now){
if(nd.id)cnt[nd.id]++;
now=nd.fail;
}
}
void query(char *t,int len=0){
if(!len)len=strlen(t);
int now=0;
rep(i,0,len-1) {
now=nd.son[t[i]-minc];
for(int j=now;j;j=node[j].fail)
if(node[j].id) {
cnt[node[j].id]++;
// count(j);
}
}
}
}acam;
vector<int> ans;
char s[maxm],p[maxn/10][60];
int main(){IO;
while(cin>>n){
acam.clear();
rep(i,1,n) {
cin>>p[i];
acam.insert(i,p[i]);
cnt[i]=0;
}
acam.init();
cin>>s;
acam.query(s);
rep(i,1,n)if(cnt[i])
cout<<p[i]<<": "<<cnt[i]<<endl;
}
}