• A Secret HDU


    赛中听说反转之后是前缀匹配就想敲自动机了,还好没真做

    赛后试了下自动机,居然真T了,删了可惜存一下吧。。。、

    回去看看自动机复杂度吧。。。

    fread也救不了。。弃疗吧

    #include<bits/stdc++.h>
    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<set>
    #include<map>
    #include<vector>
    #include<iomanip>
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define pb push_back
    #define FOR(a) for(int i=1;i<=a;i++)
    const int inf=0x3f3f3f3f;
    const int maxn=1e6+7; 
    const long long mod=1e9+7;
    const int sigma='z'-'A'+1;
    
    ll ans;
    
    struct automata{  
        int ch[maxn][sigma];  
        ll val[maxn];  
        int f[maxn];  
        int sz;  
      
        int newnode(){  
            memset(ch[sz],0,sizeof(ch[sz]));  
            f[sz]=val[sz]=0;  
            return sz++;  
        }  
      
        void init(){  
            memset(val,0,sizeof(val));  
            sz=0;  
            newnode();  
        }  
      
        void insert(char *s,int v){   
            int u=0;  
            int len=strlen(s);  
            for(int i=0;i<len;i++){  
                int id=s[i]-'A';  
                if(!ch[u][id])ch[u][id]=newnode();  
                u=ch[u][id]; 
    		   	val[u]=(1ll*(i+1))%mod;	
            }  
        }  
      
        void build(){  
            queue<int>q;  
            q.push(0);    
            while(!q.empty()){  
                int u=q.front();q.pop();  
                if(val[f[u]]){ 
                	val[u]=(val[u]+val[f[u]])%mod;  
                }   
                for(int i=0;i<sigma;i++){  
                    int v=ch[u][i];  
                    if(!v)ch[u][i]=ch[f[u]][i];  
                    else q.push(v);  
                    if(u&&v)f[v]=ch[f[u]][i];  
                }  
            }  
        }  
         
    	void query(char* s){
    		int len=strlen(s);int j=0;
    		for(int i=0;i<len;i++){
    			int id=s[i]-'A';
    			j=ch[j][id];
    			if(val[j]){/*cout<<val[j]<<endl;*/ans=(ans+val[j])%mod;}
    		}
    	}
    
    }ac; 
    
    char A[maxn];char B[maxn];
    int main(){
    	int T;scanf("%d",&T);
    	while(T--){
    		ac.init();ans=0;
    		scanf("%s%s",A,B);
    		reverse(A,A+strlen(A));reverse(B,B+strlen(B));
    		//for(int i=0;i<strlen(A);i++){
    		//	printf("%c",A[i]);
    		//}puts("");
    		//for(int i=0;i<strlen(B);i++){
    		//	printf("%c",B[i]);
    		//}puts("");
    		ac.insert(B,0);
    		ac.build();
    		ac.query(A);
    		printf("%lld
    ",ans);
    	}
    }


  • 相关阅读:
    0_ReviewML-1
    1_Convolution(卷积)
    0_overview
    遗传算法
    使用多线程下载文件思路
    大文件断点下载
    输出流
    大文件的下载
    XML解析
    文件下载
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611276.html
Copyright © 2020-2023  润新知