Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=5000005;
- const int p=1e9+7;
- int Max[N];
- int Min[N];
- int to[N][11];
- int fa[N];
- int tot;
- inline int NewNode(int mx,int mi,int *tr,int su){
- Max[tot]=mx;
- Min[tot]=mi;
- if(tr==NULL)memset(to[tot],-1,11<<2);
- else memcpy(to[tot],tr,11<<2);
- fa[tot]=su;
- return tot++;
- }
- inline int insert(int u,int c){
- int t=NewNode(Max[u]+1,0,NULL,-1);
- while(u!=-1&&to[u][c]==-1){
- to[u][c]=t;
- u=fa[u];
- }
- if(u==-1){
- Min[t]=1;
- fa[t]=0;
- return t;
- }
- int v=to[u][c];
- if(Max[u]+1==Max[v]){
- Min[t]=Max[v]+1;
- fa[t]=v;
- return t;
- }
- int x=NewNode(Max[u]+1,0,to[v],fa[v]);
- Min[t]=Min[v]=Max[x]+1;
- fa[t]=fa[v]=x;
- Min[x]=Max[fa[x]]+1;
- while(u!=-1&&to[u][c]==v){
- to[u][c]=x;
- u=fa[u];
- }
- return t;
- }
- char str[N];
- int deg[N];
- int cnt[N];
- ll sum[N];
- queue<int>Q;
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- int n;r(n);
- int lst=NewNode(0,0,NULL,-1);
- for(int i=1;i<=n;++i){
- scanf("%s",str);
- int m=strlen(str);
- for(int i=0;i<m;++i){
- lst=insert(lst,str[i]-'0');
- }
- lst=insert(lst,10);
- }
- for(int i=0;i<tot;++i){
- for(int j=0;j<=10;++j){
- deg[to[i][j]]++;
- }
- }
- Q.push(0);
- cnt[0]=1;
- ll ans=0;
- while(!Q.empty()){
- int x=Q.front();Q.pop();
- ans+=(sum[x]%=p);
- for(int i=0;i<=10;++i){
- if(~to[x][i]){
- if(i<10){
- sum[to[x][i]]+=((ll)cnt[x]*i+sum[x]*10ll)%p;
- cnt[to[x][i]]+=cnt[x];
- }
- if(!--deg[to[x][i]]){
- Q.push(to[x][i]);
- }
- }
- }
- }
- printf("%lld\n",ans%p);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement