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