查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了。

类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置了,省去了很多不必要状态。复杂度就O(n*Trie)。

终于比刘汝佳的代码优雅了(弥天大雾)

 const int maxn = 3e5 + ;
const int maxnode = * + ;
const int mod = ; int ch[maxnode][]; struct Trie {
int sz;
bool IsWord[maxnode]; Trie() {
sz = ;
init(ch[], );
} void insert(char *t) {
int len = strlen(t), u = ;
for (int i = ; i < len; ++i) {
if (!ch[u][t[i] - 'a']) {
init(ch[sz], );
IsWord[sz] = false;
ch[u][t[i] - 'a'] = sz++;
}
u = ch[u][t[i] - 'a'];
}
IsWord[u] = true;
} int find(int pos, char *str, int *dp) {
int ret = , u = ;
for (int i = pos; str[i]; ++i) {
if (!ch[u][str[i] - 'a']) return ret;
u = ch[u][str[i] - 'a'];
if (IsWord[u]) ret = ((ll)ret + dp[i + ]) % mod;
}
return ret;
}
}; char str[maxn], t[];
int S, L, dp[maxn], kase; int main() {
while (~scanf("%s", str)) {
Trie T;
for (scanf("%d", &S); S; S--) {
scanf("%s", t);
T.insert(t);
}
L = strlen(str);
dp[L] = ;
for (int i = L - ; ~i; --i) {
dp[i] = T.find(i, str, dp);
}
printf("Case %d: %d\n", ++kase, dp[]);
}
return ;
}

最新文章

  1. jquery删除数组中重复元素
  2. H5版俄罗斯方块(2)---游戏的基本框架和实现
  3. ppurl
  4. 深入JS第一天:原型和它的小伙伴们(一)
  5. 虚拟机开机提示:This virtual machine appears to be in use
  6. TOAD FOR MYSQL 进行数据插入时乱码的解决办法---MariaDB 5.5
  7. PHP面向对象的基本写法(区别于java)
  8. javascript定义类和类的实现
  9. 连接Oracle数据库的时候报了“Got minus one from a read call”
  10. ocs的沟通平台
  11. 完整Log4Net配置信息
  12. Jungle Roads(kruskar)
  13. hdu 2047递推
  14. glusterfs4.0.1 mempool 分析笔记
  15. Day5_递归_二分法
  16. 利用ZYNQ SOC快速打开算法验证通路(6)——LWIP实现千兆TCP/IP网络传输
  17. Python练习十
  18. 洛谷P1216数字三角形题解
  19. php的foreach中使用取地址符,注意释放
  20. 大公司面试经典数据结构与算法题C#/Java解答

热门文章

  1. 转移iOS App常见问题和回答
  2. java设计模式----迭代器模式和组合模式
  3. 责任链模式-Chain of Responsibility
  4. Xamarin.Android 记事本(二)自定义AlertDialog
  5. rpm的gpg key
  6. CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow
  7. 数据库连接池-配置 wallfilter问题解决-UncategorizedSQLException
  8. MapReduce ChainMapper/ChainReducer
  9. SVN命令使用详解【转】
  10. SpringBoot启动跟踪