• usaco dec 2012 first!


    字典树加拓扑排序

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<string>
      4 #include<iostream>
      5 #include<vector>
      6 using namespace std;
      7 const int  maxnode=300000+5;
      8 const int maxn=30000+5;
      9 struct Trie
     10 {
     11   int ch[maxnode][26];
     12   int pre[maxnode];
     13   int val[maxnode];
     14   string s[maxn];
     15   int terminal[maxn];
     16   int sz;
     17   int n;
     18   void insert(string str,int v)
     19   {
     20       int len=str.length();
     21       int u=0;
     22       for(int i=0;i<len;i++)
     23       {
     24           int c=str[i]-'a';
     25           if(!ch[u][c])
     26           {
     27               memset(ch[sz],0,sizeof(ch[sz]));
     28               ch[u][c]=sz++;
     29           }
     30           pre[ch[u][c]]=u;
     31           u=ch[u][c];
     32       }
     33        val[u]++;
     34       terminal[v]=u;
     35   }
     36   void initial()
     37   {
     38       sz=1;
     39       memset(ch[0],0,sizeof(ch[0]));
     40       memset(val,0,sizeof(val));
     41       memset(pre,0,sizeof(pre));
     42       scanf("%d",&n);
     43      for(int i=0;i<n;i++)
     44      {
     45         cin>>s[i];
     46         insert(s[i],i);
     47      }
     48   }
     49   bool check(int *cnt,vector<int> g[])
     50   {
     51       int top=-1;
     52       bool bcycle=false;
     53      for(int i=0;i<26;i++)
     54      {
     55          if(cnt[i]==0)
     56          {
     57              cnt[i]=top;
     58              top=i;
     59          }
     60      }
     61      for(int i=0;i<26;i++)
     62      {
     63          if(top==-1) {bcycle=true;break;}
     64          else
     65          {
     66              int j=top;top=cnt[top];
     67              for(int k=0;k<g[j].size();k++)
     68              {
     69                  int u=g[j][k];
     70                  if(--cnt[u]==0)
     71                  {
     72                      cnt[u]=top;
     73                      top=u;
     74                  }
     75              }
     76          }
     77      }
     78      if(bcycle) return false;
     79      return true;
     80   }
     81   void solve()
     82   {
     83       initial();
     84       vector<int> g[27];
     85       int cnt[27];
     86       int ans[n];
     87       memset(ans,0,sizeof(ans));
     88       int tot=0;
     89       for(int i=0;i<n;i++)
     90       {
     91           for(int j=0;j<26;j++) g[j].clear();
     92           memset(cnt,0,sizeof(cnt));
     93           int cur=terminal[i];
     94           int flag=1;
     95           for(int j=s[i].length()-1;j>=0;j--)
     96           {
     97               int c=s[i][j]-'a';
     98               cur=pre[cur];
     99               if(val[cur]) flag=0;
    100               for(int k=0;k<26;k++)
    101               {
    102                   if(ch[cur][k]&&k!=c)
    103                   {
    104                       g[c].push_back(k);
    105                       cnt[k]++;
    106                   }
    107               }
    108           }
    109           if(flag&&check(cnt,g)) {tot++;ans[i]=1;}
    110       }
    111       printf("%d
    ",tot);
    112       for(int i=0;i<n;i++)
    113       {
    114           if(ans[i]) cout<<s[i]<<endl;
    115       }
    116   }
    117 };
    118 Trie trie;
    119 int main()
    120 {
    121    //freopen("24123.in","r",stdin);
    122    //freopen("24123.out","w",stdout);
    123     trie.solve();
    124 }

  • 相关阅读:
    Testlink & Redmine组合拳演练
    使用IP欺骗Loadrunner并发测试小结
    程序设计的思想与执行步骤参考
    读《世界是自己的,与他人无关》
    读《A4纸上的奇迹》
    读《流动的盛宴》
    既往不恋,当下不杂,未来不乱——读《怦然心动的人生整理魔法》
    GridCtrl学习笔记(3)一行一行地更新表格,有bug版
    GridCtrl学习笔记(2)寻找自动更新表格的最新数据并把其显示到当前窗口的方法
    GridCtrl学习笔记(1)建立使用GridCtrl的工程
  • 原文地址:https://www.cnblogs.com/sooflow/p/3378680.html
Copyright © 2020-2023  润新知