博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Remember the Word,LA3942(Trie树+DP)
阅读量:6207 次
发布时间:2019-06-21

本文共 1794 字,大约阅读时间需要 5 分钟。

Trie树基础题,记录下代码。

#include 
#include
#define MaxNode 4005*100#define NodeSize 26#define MOD 20071027char givenword[300005];int ans[300005];int next[MaxNode][NodeSize];class Trie{ public: int val[MaxNode]; int sz; Trie(){ sz = 1; //初始时有一个根结点 memset(next[0], 0, sizeof(next[0])); } int idx(char ch){ return ch - 'a'; } void insert(char *s, int v){ int len = strlen(s); int d = 0; for(int i = 0; i < len; ++i){ int _idx = idx(s[i]); if(!next[d][_idx]){ memset(next[sz],0,sizeof(next[sz])); val[sz] = 0; next[d][_idx] = sz++; } d = next[d][_idx]; } val[d] = v; } void query(char *s,int pos){ int len = strlen(s); int d = 0; for(int i = 0; i < len; ++i){ int _idx = idx(s[i]); if(!next[d][_idx]) return; d = next[d][_idx]; if(val[d]){ ans[pos] += ans[pos+i+1]; if(ans[pos] > MOD) ans[pos] -= MOD; } } return; }};int main(){ int S; int Case = 1; while(scanf("%s",givenword)!=EOF){ int len = strlen(givenword); memset(ans,0,(len+1)*sizeof(int)); ans[len] = 1; scanf("%d",&S); char tstr[105]; Trie trie; for(int i = 0;i < S;++i){ scanf("%s",tstr); trie.insert(tstr,1); } for(int i = len-1; i >= 0; --i){ trie.query(&givenword[i],i); } printf("Case %d: ",Case++); printf("%d\n",ans[0]); } return 0;}

转载地址:http://qfzja.baihongyu.com/

你可能感兴趣的文章
[Leetcode] Trapping Rain Water
查看>>
算法练习 (二)
查看>>
程序员谈学习:我为什么要学习Linux?
查看>>
Oracle Essbase入门系列(一)
查看>>
Python编程-Office操作-操作Excel(上)
查看>>
IOCP数据中间件
查看>>
人性的重构
查看>>
SQL Server 排名函数 简单应用
查看>>
条件变量
查看>>
su su- sudo
查看>>
HTML5是否已为实际应用做好准备?
查看>>
大叔手记全集
查看>>
Windows phone 应用开发[7]-MEF For Windows phone
查看>>
卓越软件工程--《微软360度》读后感
查看>>
gcc 之 inline
查看>>
ORA-28001: the password has expired
查看>>
ssh ip "WARING:REMOTE HOST IDENTIFICATION HAS CHANGED!"
查看>>
poj3331
查看>>
23种基本的设计模式
查看>>
多线程开发
查看>>