• HDU


    记一下数组+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 '
    '
    #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 '
    '
    #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;
      }
    }
    
  • 相关阅读:
    886C. Petya and Catacombs#墓室探险(set集合)
    uc/os调度机制深度解析
    总结使用QObject实现线程
    日常总结--c++常量的深入理解
    数据结构与算法--跳跃链表
    java下输出中文的一点研究
    java使用readUTF()读取中文抛出EOFException异常的处理方法
    java连接5.1以上的mysql出现问题---The server time zone value '???ú±ê×??±??' is unrecognized or represents more than one time zone.
    Qt入门便遇到坑--向QMainWindow类及其子类中添加布局
    linux_4.19内核编译总结
  • 原文地址:https://www.cnblogs.com/nervendnig/p/11231260.html
Copyright © 2020-2023  润新知