noip模拟赛 单词


分析:这道题真心难想.最主要的是怎么样不重复.
为了不重复统计,把所有符合条件的单词分成两类,一类是某些单词的前缀,一类是 不是任何单词的前缀.涉及到前缀后缀,维护两个trie树,处理3个数组a,b,c. a[i][j]表示长度为i-1的前缀,第i位接字母j是不是任何单词的前缀的个数. b[i][j]表示长度为i,最后一个字母为j,并且不是词典中单词的前缀的个数.c[i][j]表示长度为i,第一个字母为j的后缀的个数.
先统计每个单词本身.再来考虑每个单词除了自身外的前缀.比如一个单词abcd,它的前缀有abc,ab,a.现在的任务就是看能不能拼出它们.比较棘手的一个问题就是每一个单词可以从多个位置划分,abc可以划分成ab c,也可以划分成a bc,为了不重复统计同一个单词,强行规定划分最后面的一个字符.
因为这一类单词都是前缀+后缀拼接起来的,所以划分出来的最后一个字符一定要作为某个单词的后缀,整个单词必须是词典中某个单词的前缀,这是由分类决定的,利用b,c两个数组能统计出答案,由于b数组的定义,保证了不会将一个词典中出现过的单词统计两次.
还有一类是 不是任意单词的前缀的单词.利用a,c两个数组来统计.两个单词abce,cd.
a[4][d]*c[1][d]就是这一类单词有多少个.需要意会一下,两类的答案相加就是答案了.
为了使统计不重复,可以把所有的元素划分为若干个没有交集的集合,分别统计.
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int mod = 1e9 + ; int n, q, a[][], b[][], c[][];
long long cnt[];
char s[]; struct node
{
int tree[][];
int flag[];
int tot;
node() {
memset(tree, , sizeof(tree));
memset(flag, , sizeof(flag));
tot = ;
}
void insert(char *s)
{
int id = ;
for (int i = ; s[i]; i++)
{
if (tree[id][s[i] - 'a'])
id = tree[id][s[i] - 'a'];
else
id = tree[id][s[i] - 'a'] = ++tot;
}
flag[id]++;
}
void dfs(int x, int l)
{
for (int i = ; i < ; i++)
{
if (tree[x][i] == && x)
a[l][i]++;
if (tree[x][i] && x && !flag[tree[x][i]])
b[l + ][i]++;
if (tree[x][i])
dfs(tree[x][i], l + );
}
}
void dfs2(int x, int l)
{
for (int i = ; i < ; i++)
if (tree[x][i])
{
c[l + ][i]++;
dfs2(tree[x][i], l + );
}
}
}t1,t2; int main()
{
scanf("%d%d", &n, &q);
for (int i = ; i <= n; i++)
{
scanf("%s", s);
int len = strlen(s);
t1.insert(s);
reverse(s, s + len);
t2.insert(s);
cnt[len]++;
}
t1.dfs(,);
t2.dfs2(,);
for (int i = ; i <= ; i++)
for (int j = ; j < ; j++)
if (c[][j])
cnt[i] += b[i][j];
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++)
for (int k = ; k < ; k++)
cnt[i + j] += 1LL * a[i][k] * c[j][k];
int l;
while (q--)
{
scanf("%d", &l);
printf("%lld\n", cnt[l] % mod);
} return ;
}
noip模拟赛 单词的更多相关文章
- NOIP模拟赛-2018.11.5
NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...
- 2016-06-19 NOIP模拟赛
2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- APP多渠道打包
多渠道打包的概念: 打包是指使用证书文件对app签名生成一个apk文件. 多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场.百度市场等,为了统计应用在各个市场的 ...
- Polynomial Division 数学题
https://www.hackerrank.com/contests/101hack45/challenges/polynomial-division 询问一个多项式能否整除一个一次函数.a * x ...
- 转】R利剑NoSQL系列文章 之 Hive
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/ 感谢! Posted: Jul 27, 2013 Ta ...
- vue采坑及较好的文章汇总
1:父子组件传动态传值 https://www.cnblogs.com/daiwenru/p/6694530.html -----互传数据基本流程 https://blog.csdn.net/qq_ ...
- Redux中的异步操作
异步操作的另一种方案就是让Action Creator返回一个Promise对象. 我们这边使用 redux-promise 中间件 import { createStore, applyMidd ...
- 关于Android软键盘把布局顶上去的问题(一)
最近接触到了一个登陆页面,布局最上面显示的是一个波纹的view,中间显示账号和密码的EditText,紧接着还有一个Button: 希望:点击EditText时,软键盘不能把波纹的view顶出去,也不 ...
- 调试SQL Server的存储过程及用户定义函数
分类: 数据库管理 2005-06-03 13:57 9837人阅读 评论(5) 收藏 举报 sql server存储vb.net服务器sql语言 1.在查询分析器中调试 查询分析器中调试的步骤如下: ...
- 第三方知乎专栏应用Android源码
这是一个国内开发者白瓦力贡献的一个简约的第三方知乎客户端,也许完整度不太高,但感觉还是相当不错的,其实我也是一个知乎迷,尽管平时围观的比较多. 我相信很多搞安卓开发的童鞋也去过知乎解惑吧.引用作者的描 ...
- 在死循环中使用Scanner获得键盘输入
1. 编译时无错误和警告,且运行过程中无异常的代码示例 //编译时无错误和警告,且运行过程中无异常的代码示例package scanner_test; import java.util.*; publ ...
- netstat -a 显示出你的计算机当前所开放的所有端口
netstat -s -e 比较详细的显示你的网络资料,包括TCP.UDP.ICMP 和 IP的统计等