模板题,找来测代码。

注意有相同单词

//#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自动机的更多相关文章

  1. Substring Frequency (II) LightOJ - 1427 AC自动机

    https://vjudge.net/problem/LightOJ-1427 把所有模式串加入ac自动机,然后search的时候暴力,每个子串都暴力一下就好. 其实AC自动机就是,先建立好trie图 ...

  2. Substring UVA - 11468 AC自动机+概率DP

    题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...

  3. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

  4. UVA11468 Substring --- AC自动机 + 概率DP

    UVA11468 Substring 题目描述: 给定一些子串T1...Tn 每次随机选择一个字符(概率会给出) 构造一个长为n的串S,求T1...Tn不是S的子串的概率 直接把T1...Tn建成AC ...

  5. UVA-11468 Substring(AC自动机+DP)

    题目大意:给一些模板串,一些字符的出现概率.问不会出现模板串的概率是多少. 题目分析:是比较简单的概率DP+AC自动机.利用全概率公式递推即可. 代码如下: # include<iostream ...

  6. UVa 11468 (AC自动机 概率DP) Substring

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...

  7. Codeforces963C Frequency of String 【字符串】【AC自动机】

    题目大意: 给一个串s和很多模式串,对每个模式串求s的一个最短的子串使得这个子串中包含至少k个该模式串. 题目分析: 均摊分析,有sqrt(n)种长度不同的模式串,所以有关的串只有msqrt(n)种. ...

  8. 沉迷AC自动机无法自拔之:[UVA 11468] Substring

    图片加载可能有点慢,请跳过题面先看题解,谢谢 这个鬼题目,上一波套路好了 先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\) ...

  9. UVa 11468 Substring (AC自动机+概率DP)

    题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...

随机推荐

  1. 自己用C语言写单片机PIC18 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  2. 正确理解ThreadLocal

    想必很多朋友对 ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理 解,然后根据ThreadLocal类的 ...

  3. python绘图中使用公式时,解决\frac{}{}出来的字体太小的问题

    在用matplotlib绘图需要在图片中加入公式时,一般要用 text 或 annotate函数,并结合latex语法 '$...$'. 对于分数,如果直接使用\frac{}{},会造成分子分母上的字 ...

  4. KBMMW 中 IOS IPv6 的解决

    自从今年苹果强制新上架的APP 必须支持Ipv6,很多原来需要网络支持的APP 就没法上架了. 别的我们就不说了,先说说kbmmw 中,如何解决这个问题. 要测试你的app 是否支持ipv6, 首先要 ...

  5. 第五章 征服数据库(Spring对DB的使用)——开发持久层

    本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中, ...

  6. apk添加系统签名

    上一节,可以通过添加su的方式获取系统权限,但这种存在安全隐患,故不推荐,本文通过获取数字签名方式获取系统权限. 在我们的AndroidManifest.xml中添加    android:share ...

  7. 一步一步学WebSocket (一) 初识WebSocket

    众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务器 ...

  8. hdu1540 Tunnel Warfare

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. poj1753改

    #include<iostream> char data[16]; int a[16]; int d[5]={0,-4,1,4,-1}; char b[16]; int flag; int ...

  10. sql 事物以及回滚

    第一种: Begin Try    Begin Tran Tran1        insert into t1(Id, c1) values(1,'1')        insert into t1 ...