Advertisement
yicongli

HIHO1457

Mar 7th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 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=5000005;
  17. const int p=1e9+7;
  18.  
  19. int Max[N];
  20. int Min[N];
  21. int to[N][11];
  22. int fa[N];
  23.  
  24. int tot;
  25.  
  26. inline int NewNode(int mx,int mi,int *tr,int su){
  27.     Max[tot]=mx;
  28.     Min[tot]=mi;
  29.     if(tr==NULL)memset(to[tot],-1,11<<2);
  30.     else memcpy(to[tot],tr,11<<2);
  31.     fa[tot]=su;
  32.     return tot++;
  33. }
  34.  
  35. inline int insert(int u,int c){
  36.     int t=NewNode(Max[u]+1,0,NULL,-1);
  37.     while(u!=-1&&to[u][c]==-1){
  38.         to[u][c]=t;
  39.         u=fa[u];
  40.     }
  41.     if(u==-1){
  42.         Min[t]=1;
  43.         fa[t]=0;
  44.         return t;
  45.     }
  46.     int v=to[u][c];
  47.     if(Max[u]+1==Max[v]){
  48.         Min[t]=Max[v]+1;
  49.         fa[t]=v;
  50.         return t;
  51.     }
  52.     int x=NewNode(Max[u]+1,0,to[v],fa[v]);
  53.     Min[t]=Min[v]=Max[x]+1;
  54.     fa[t]=fa[v]=x;
  55.     Min[x]=Max[fa[x]]+1;
  56.     while(u!=-1&&to[u][c]==v){
  57.         to[u][c]=x;
  58.         u=fa[u];
  59.     }
  60.     return t;
  61. }
  62.  
  63. char str[N];
  64. int deg[N];
  65. int cnt[N];
  66. ll sum[N];
  67.  
  68. queue<int>Q;
  69.  
  70. int main(){
  71. //  freopen(".in","r",stdin);
  72. //  freopen(".out","w",stdout);
  73.     int n;r(n);
  74.     int lst=NewNode(0,0,NULL,-1);
  75.     for(int i=1;i<=n;++i){
  76.         scanf("%s",str);
  77.         int m=strlen(str);
  78.         for(int i=0;i<m;++i){
  79.             lst=insert(lst,str[i]-'0');
  80.         }
  81.         lst=insert(lst,10);
  82.     }
  83.     for(int i=0;i<tot;++i){
  84.         for(int j=0;j<=10;++j){
  85.             deg[to[i][j]]++;
  86.         }
  87.     }
  88.     Q.push(0);
  89.     cnt[0]=1;
  90.     ll ans=0;
  91.     while(!Q.empty()){
  92.         int x=Q.front();Q.pop();
  93.         ans+=(sum[x]%=p);
  94.         for(int i=0;i<=10;++i){
  95.             if(~to[x][i]){
  96.                 if(i<10){
  97.                     sum[to[x][i]]+=((ll)cnt[x]*i+sum[x]*10ll)%p;
  98.                     cnt[to[x][i]]+=cnt[x];
  99.                 }
  100.                 if(!--deg[to[x][i]]){
  101.                     Q.push(to[x][i]);
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     printf("%lld\n",ans%p);
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement