lightoj 1427 - Substring Frequency (II) AC自动机
模板题,找来测代码。
注意有相同单词
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<cmath>
#include<climits>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define pb(a) push(a)
#define INF 0x1f1f1f1f
#define lson idx<<1,l,mid
#define rson idx<<1|1,mid+1,r
#define PI 3.1415926535898
template<class T> T min(const T& a, const T& b, const T& c)
{
return min(min(a, b), c);
}
template<class T> T max(const T& a, const T& b, const T& c)
{
return max(max(a, b), c);
}
void debug()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
// freopen("d:\\out1.txt","w",stdout);
#endif
}
int getch()
{
int ch;
while((ch = getchar()) != EOF)
{
if(ch!=' ' && ch!='\n') return ch;
}
return EOF;
} const int max_len = ;
const int max_node = max_len * max_len;
const int sigma_size = ; struct ac_automation
{
int sz;
int ch[max_node][sigma_size];
int fail[max_node];
vector<int> val[max_node];
int last[max_node]; void init()
{
memset(ch[], , sizeof(ch[]));
val[].clear();
sz = ;
}
int id(char c)
{
return c - 'a';
}
void insert(const char *s, int v)
{
int u = ;
for(int i = ; s[i] != '\0'; i++)
{
int v = id(s[i]);
if(!ch[u][v])
{
memset(ch[sz], , sizeof(ch[sz]));
val[sz].clear();
ch[u][v] = sz++;
}
u = ch[u][v];
}
val[u].push_back(v);
} void construct()
{
queue<int> q;
fail[] = ;
for(int c = ; c < sigma_size; c++)
{
int u = ch[][c];
if(u) {q.push(u); fail[u] = ; last[u] = ; }
} while(!q.empty())
{
int r = q.front(); q.pop();
for(int c = ; c < sigma_size; c++)
{
int u = ch[r][c];
if(u)
{
q.push(u);
fail[u] = ch[fail[r]][c];
last[u] = (!val[fail[u]].empty()) ? fail[u] : last[fail[u]];
} else ch[r][c] = ch[fail[r]][c];
}
}
} void count(int x[], int u)
{
if(val[u].size() > )
{
for(int i = ; i < val[u].size(); i++)
x[val[u][i]]++;
count(x, last[u]);
}
}
void find(const char *T, int x[])
{
int u = ;
for(int i = ; T[i] != '\0'; i++)
{
int v = id(T[i]);
u = ch[u][v];
if(!val[u].empty()) count(x, u);
else if(last[u]) count(x, last[u]);
}
}
}; ac_automation solver;
const int maxn = ;
char T[maxn];
int ans[maxn]; int main()
{
debug();
int t;
scanf("%d", &t);
for(int ca = ; ca <= t; ca++)
{
solver.init();
int n;
scanf("%d%s", &n, T);
for(int i = ; i <= n; i++)
{
char word[max_len];
scanf("%s", word);
solver.insert(word, i);
}
solver.construct(); memset(ans, , sizeof(ans));
solver.find(T, ans); printf("Case %d:\n", ca);
for(int i = ; i <= n; i++)
{
printf("%d\n", ans[i]);
}
}
return ;
}
lightoj 1427 - Substring Frequency (II) AC自动机的更多相关文章
- Substring Frequency (II) LightOJ - 1427 AC自动机
https://vjudge.net/problem/LightOJ-1427 把所有模式串加入ac自动机,然后search的时候暴力,每个子串都暴力一下就好. 其实AC自动机就是,先建立好trie图 ...
- Substring UVA - 11468 AC自动机+概率DP
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...
- Codeforces 1015F Bracket Substring AC自动机 + dp
Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...
- UVA11468 Substring --- AC自动机 + 概率DP
UVA11468 Substring 题目描述: 给定一些子串T1...Tn 每次随机选择一个字符(概率会给出) 构造一个长为n的串S,求T1...Tn不是S的子串的概率 直接把T1...Tn建成AC ...
- UVA-11468 Substring(AC自动机+DP)
题目大意:给一些模板串,一些字符的出现概率.问不会出现模板串的概率是多少. 题目分析:是比较简单的概率DP+AC自动机.利用全概率公式递推即可. 代码如下: # include<iostream ...
- UVa 11468 (AC自动机 概率DP) Substring
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...
- Codeforces963C Frequency of String 【字符串】【AC自动机】
题目大意: 给一个串s和很多模式串,对每个模式串求s的一个最短的子串使得这个子串中包含至少k个该模式串. 题目分析: 均摊分析,有sqrt(n)种长度不同的模式串,所以有关的串只有msqrt(n)种. ...
- 沉迷AC自动机无法自拔之:[UVA 11468] Substring
图片加载可能有点慢,请跳过题面先看题解,谢谢 这个鬼题目,上一波套路好了 先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\) ...
- UVa 11468 Substring (AC自动机+概率DP)
题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...
随机推荐
- git 撤销commit
如果不小心commit了一个不需要commit的文件,可以对其进行撤销. 先使用git log 查看 commit日志 commit 422bc088a7d6c5429f1d0760d008d86c5 ...
- Broadcom以太网交换芯片培训
目录 1.交换芯片架构....................................................................................... ...
- Xena测试仪的自动化
Xena,Xena Networks公司的网络测试仪,也能覆盖以太网L2~L7层测试仪,但功能较简单,界面也很简洁,用起来比较直观方便. 1.Xena的自动化测试场景 测试PC上的AT框架--> ...
- 从不同方面寻找bug
从小学生的角度,为了熟能生巧,更好掌握知识,那就需要不断的练习,然而app没有重新开始的功能,要退出再重新进入,很麻烦.还有,如果小学生只想做一类的计算,例如,只想做减法或乘法,那么它就不能满足. 我 ...
- IP转换hash以及返回
InetAddress address = InetAddress.getByName("127.0.0.1"); System.out.println(address); int ...
- Python描述符(descriptor)解密(转)
原文:http://www.geekfan.net/7862/ Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装 ...
- 6.openssl rsautl和openssl pkeyutl
rsautl是rsa的工具,相当于rsa.dgst的部分功能集合.可用于签名.验证.加密和解密文件.非对称密钥的密钥是随机生成的,因此不需要也无法指定salt参与加密. pkeyutl是非对称加密的通 ...
- 第十五课:奇葩的元素节点iframe
iframe一般用来加载一个页面,然后嵌入到主页面中.创建起来消耗资源,而且消耗连接数.但是它是一个物超所值的东西,可以实现无缝刷新,模拟onhashchange跨域,安全的加载第三方资源与广告,实现 ...
- 使用myeclipse为java web项目添加SSH框架
添加SSH框架时,要严格按照先Struts,再Spring,最后Hibernate.添加方法见下方: 第一步:添加Struts框架 请按照图示一步步认真执行,配置好struts才可以进行下一步 第二步 ...
- #define 小知识
#define N 15 #define M 2+N #define W 2*M 问3*W的结果是多少? 结果为27: 知识点:define只能进行非常简单的运算,简单来说就是仅仅是将自身的值代入,而 ...