首页 > 其他分享 >uva 1401 字典树模板

uva 1401 字典树模板

时间:2022-10-27 18:46:00浏览次数:57  
标签:tmp ch int str uva 1401 include 模板 字典

给一个串和一个字典(一些字符串)

将这个串分解为字典单词的连接(如 abcd = ab+cd =a+bcd )

问有多少方案

线性dp

枚举位置 i

f[i] += f[j] i<j , string(i,j) 为字典单词

直接枚举 j 和单词 明显超时

用到字典树,从 位置 i 开始在字典树上找单词,找到后更新 f[i]

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
 #define mod 20071027
 const int N=5e5;
 
 int n;
 int tot,ch[N][30],val[N];
 char str[N],tmp[N];
 int f[N],L[N];
 
 void insert(char *s,int v){
     int i,u=1,l=strlen(s);
     
     for(i=0;i<l;i++){
         int c=s[i]-'a';
         if(ch[u][c]==0){
             ++tot;
             memset(ch[tot],0,sizeof ch[tot]);
             ch[u][c]=tot; val[tot]=0;
         }
         u=ch[u][c];
     }
    val[u]=v;
 }
 void find(char *s,int len,int id){
     int i,u=1;
     for(i=0;i<len;i++){
         if(s[i]=='\0') break;
         int c=s[i]-'a';
         if(ch[u][c]==0) break;
         u=ch[u][c];
         if(val[u]!=0) 
          f[id]+=f[id+L[val[u]]],f[id]%=mod;
     }
 }
 int main(){
 //    
     int i,j,cas=0;
     
     while(cin>>str>>n){
         memset(f,0,sizeof f);
         tot=1; 
         memset(ch[1],0,sizeof ch[1]);
         for(i=1;i<=n;i++){
             cin>>tmp; insert(tmp,i); L[i]=strlen(tmp);
         }
         int l=strlen(str);
         f[l]=1;
        
        for(i=l-1;i>=0;i--){
            find(str+i,l-i,i);
        }
        printf("Case %d: %d\n",++cas,f[0]);
     }
 }
 
 

 

 

  

标签:tmp,ch,int,str,uva,1401,include,模板,字典
From: https://www.cnblogs.com/towboa/p/16833285.html

相关文章

  • uva 10635
    两个数组a,b,首元素都为1,a[i] b[i]<=K^2求最长公共子序列的长度 暴力LCS会T,但注意两个序列的元素都<=K^2对b[i]找到a[j]配对(不存在为0),构造一个新序列,变为求LIS......
  • springboot+easypoi模板导出Excel 动态表头+多表格(一个sheet)
    1.需求:将此页面的几个表格导出其中表头中的仓库集散地是是动态生成的。首先制作Excel模板:代码:@Resource privateRedisServiceredisService; @Override......
  • flask的自定义bootstrap模板
    由于​​flask-bootstrap​​​的​​base.html​​​模板提供功能有限(文件位置:​​/site-packages/flask_bootstrap/templates/bootstrap/base.html​​),比如我想在body中最......
  • 界面控件DevExtreme中文使用指南——如何构建 & 应用模板
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能......
  • AIR32F103(三) Linux环境基于标准外设库的项目模板
    目录AIR32F103(一)合宙AIR32F103CBT6开发板上手报告AIR32F103(二)Linux环境和LibOpenCM3项目模板AIR32F103(三)Linux环境基于标准外设库的项目模板Linux开发环境......
  • 模板整理(2022.10)
    模板整理(2022.10)1.线性筛素数boolis_prime[100000005];//是否为素数intprime[100005],cnt;//素数数组,cnt:素数个数voidget_prime(intmaxn){ memset(is_prime,1......
  • C++模板元编程实战 电子书 pdf
    作者:李伟出版社:人民邮电出版社副标题:一个深度学习框架的初步实现 链接:C++模板元编程实战  《C++模板元编程实战:一个深度学习框架的初步实现》以一个深度学......
  • 用函数模板实现对n个数进行由小到大排序
    #include<iostream>usingnamespacestd;//用模板实现两个数值交换template<classT>voidtswap(T*x,T*y){inttemp=*x;*x=*y;*y=temp;}//排序模板......
  • 用函数模板比较两个数的大小
    #include<iostream>usingnamespacestd;//用模板实现输出两个数当中最小的值template<classT>Ttmin(Tx,Ty){returnx<y?x:y;}voidmain(){inta=5,b......
  • 用函数模板实现两个数值交换
    #include<iostream>usingnamespacestd;//用模板实现两个数值交换template<classT>voidtswap(T*x,T*y){inttemp=*x;*x=*y;*y=temp;}voidmain()......