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=3e6+7;
- const int p=1e9+7;
- inline int index(const char &c){
- switch(c){
- case 'A':return 0;
- case 'C':return 1;
- case 'G':return 2;
- case 'T':return 3;
- }
- assert(0);
- }
- inline char xedni(const int &x){
- switch(x){
- case 0:return 'A';
- case 1:return 'C';
- case 2:return 'G';
- case 3:return 'T';
- }
- assert(0);
- }
- namespace sam{
- int tot;
- int len[N];
- int trans[N][4];
- int fa[N];
- inline int NewNode(int mx,int *tr,int su){
- ++tot;
- len[tot]=mx;
- if(tr!=NULL)memcpy(trans[tot],tr,4<<2);
- fa[tot]=su;
- return tot;
- }
- inline int Extend(int rt,int u,int c){
- int t=NewNode(len[u]+1,NULL,0);
- for(;u&&!trans[u][c];u=fa[u])trans[u][c]=t;
- if(!u){
- fa[t]=rt;
- return t;
- }
- int v=trans[u][c];
- if(len[v]==len[u]+1){
- fa[t]=v;
- return t;
- }
- int x=NewNode(len[u]+1,trans[v],fa[v]);
- fa[t]=fa[v]=x;
- for(;u&&trans[u][c]==v;u=fa[u])trans[u][c]=x;
- return t;
- }
- char sta[N];
- void dfs(int x,int len){
- for(int i=0;i<len;++i){
- putchar(sta[i]);
- }
- putchar('\n');
- for(int i=0;i<4;++i){
- int v=trans[x][i];
- if(!v)continue;
- sta[len]=xedni(i);
- dfs(v,len+1);
- }
- }
- char s[N];
- inline void solve1(){
- scanf("%s",s);
- int n=strlen(s);
- int lst=NewNode(0,NULL,0);
- for(int i=0;i<n;++i){
- lst=Extend(1,lst,index(s[i]));
- }
- ll ans=0;
- for(int i=1;i<=tot;++i){
- ans+=len[i]-len[fa[i]];
- }
- int k;r(k);
- if(k)dfs(1,0);
- printf("%lld\n",(ans+1)%p);
- exit(0);
- }
- int siz[N];
- int dfs0(int x){
- if(siz[x])return siz[x];
- siz[x]=1;
- for(int i=0;i<4;++i){
- int v=trans[x][i];
- if(!v)continue;
- (siz[x]+=dfs0(v))%=p;
- }
- return siz[x];
- }
- int bg[N];
- int ed[N];
- inline void solve2(int m){
- for(int j=1;j<=m;++j){
- scanf("%s",s);
- int n=strlen(s);
- int lst=NewNode(0,NULL,0);
- bg[j]=lst;
- for(int i=0;i<n;++i){
- lst=Extend(bg[j],lst,index(s[i]));
- }
- ed[j]=lst;
- }
- for(int j=m;j>1;--j){
- for(int k=0;k<4;++k){
- int t=trans[bg[j]][k];
- if(!t)continue;
- for(int i=bg[j-1];i<bg[j];++i){
- if(!trans[i][k])trans[i][k]=t;
- }
- }
- }
- int ans=dfs0(1);
- int k;r(k);
- if(k){
- dfs(1,0);
- }
- printf("%d\n",ans);
- }
- }
- int main(){
- freopen("copy.in","r",stdin);
- freopen("copy.out","w",stdout);
- int n;r(n);
- if(n==1)sam::solve1();
- else
- sam::solve2(n);
- return 0;
- }
- /*
- 3
- A
- A
- A
- 1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement