Advertisement
yicongli

T157T2

Mar 20th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=3e6+7;
  17. const int p=1e9+7;
  18.  
  19. inline int index(const char &c){
  20.     switch(c){
  21.         case 'A':return 0;
  22.         case 'C':return 1;
  23.         case 'G':return 2;
  24.         case 'T':return 3;
  25.     }
  26.     assert(0);
  27. }
  28.  
  29. inline char xedni(const int &x){
  30.     switch(x){
  31.         case 0:return 'A';
  32.         case 1:return 'C';
  33.         case 2:return 'G';
  34.         case 3:return 'T';
  35.     }
  36.     assert(0);
  37. }
  38.  
  39. namespace sam{
  40.     int tot;
  41.     int len[N];
  42.     int trans[N][4];
  43.     int fa[N];
  44.    
  45.     inline int NewNode(int mx,int *tr,int su){
  46.         ++tot;
  47.         len[tot]=mx;
  48.         if(tr!=NULL)memcpy(trans[tot],tr,4<<2);
  49.         fa[tot]=su;
  50.         return tot;
  51.     }
  52.    
  53.     inline int Extend(int rt,int u,int c){
  54.         int t=NewNode(len[u]+1,NULL,0);
  55.         for(;u&&!trans[u][c];u=fa[u])trans[u][c]=t;
  56.         if(!u){
  57.             fa[t]=rt;
  58.             return t;
  59.         }
  60.         int v=trans[u][c];
  61.         if(len[v]==len[u]+1){
  62.             fa[t]=v;
  63.             return t;
  64.         }
  65.         int x=NewNode(len[u]+1,trans[v],fa[v]);
  66.         fa[t]=fa[v]=x;
  67.         for(;u&&trans[u][c]==v;u=fa[u])trans[u][c]=x;
  68.         return t;
  69.     }
  70.    
  71.     char sta[N];
  72.     void dfs(int x,int len){
  73.         for(int i=0;i<len;++i){
  74.             putchar(sta[i]);
  75.         }
  76.         putchar('\n');
  77.         for(int i=0;i<4;++i){
  78.             int v=trans[x][i];
  79.             if(!v)continue;
  80.             sta[len]=xedni(i);
  81.             dfs(v,len+1);
  82.         }
  83.     }
  84.    
  85.     char s[N];
  86.    
  87.     inline void solve1(){
  88.         scanf("%s",s);
  89.         int n=strlen(s);
  90.         int lst=NewNode(0,NULL,0);
  91.         for(int i=0;i<n;++i){
  92.             lst=Extend(1,lst,index(s[i]));
  93.         }
  94.         ll ans=0;
  95.         for(int i=1;i<=tot;++i){
  96.             ans+=len[i]-len[fa[i]];
  97.         }
  98.         int k;r(k);
  99.         if(k)dfs(1,0);
  100.         printf("%lld\n",(ans+1)%p);
  101.         exit(0);
  102.     }
  103.    
  104.     int siz[N];
  105.     int dfs0(int x){
  106.         if(siz[x])return siz[x];
  107.         siz[x]=1;
  108.         for(int i=0;i<4;++i){
  109.             int v=trans[x][i];
  110.             if(!v)continue;
  111.             (siz[x]+=dfs0(v))%=p;
  112.         }
  113.         return siz[x];
  114.     }
  115.     int bg[N];
  116.     int ed[N];
  117.     inline void solve2(int m){
  118.         for(int j=1;j<=m;++j){
  119.             scanf("%s",s);
  120.             int n=strlen(s);
  121.             int lst=NewNode(0,NULL,0);
  122.             bg[j]=lst;
  123.             for(int i=0;i<n;++i){
  124.                 lst=Extend(bg[j],lst,index(s[i]));
  125.             }
  126.             ed[j]=lst;
  127.         }
  128.         for(int j=m;j>1;--j){
  129.             for(int k=0;k<4;++k){
  130.                 int t=trans[bg[j]][k];
  131.                 if(!t)continue;
  132.                 for(int i=bg[j-1];i<bg[j];++i){
  133.                     if(!trans[i][k])trans[i][k]=t;
  134.                 }
  135.             }
  136.         }
  137.         int ans=dfs0(1);
  138.         int k;r(k);
  139.         if(k){
  140.             dfs(1,0);
  141.         }
  142.         printf("%d\n",ans);
  143.     }
  144.        
  145. }
  146.  
  147. int main(){
  148.     freopen("copy.in","r",stdin);
  149.     freopen("copy.out","w",stdout);
  150.     int n;r(n);
  151.     if(n==1)sam::solve1();
  152.     else
  153.     sam::solve2(n);
  154.     return 0;
  155. }
  156. /*
  157. 3
  158. A
  159. A
  160. A
  161. 1
  162. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement