上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 22 下一页
摘要: 题意:给出一个n*m的字符矩阵T,你的任务是找出给定的x*y的字符矩阵P在T中出现了多少次.分析:要想整个矩阵匹配,至少各行都得匹配。所以先把P的每行看做一个模式串构造出AC自动机,然后在T中的各行逐一匹配,找到P中每一行的所有匹配点。只要在匹配时做一些附加操作,就可以把匹配出来的单一的行拼成矩形。用一个d[r][c]表示T中一(r,c)为右上角,与P等大的矩形中有多少个完整的行和P对应位置的行完全相同.当P的第i行出现在T的第r行,起始列编号为c时,意味着d[r-i][c]应当加1.所有匹配结束后,d[r][c]=X的那些就是一个二维匹配点.注意:模式串有可能相同,因此需要一个链表来相同的模 阅读全文
posted @ 2013-03-23 20:14 z.arbitrary 阅读(1207) 评论(0) 推荐(0) 编辑
摘要: 刘汝佳新书-----训练指南题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串,计算S不包含任何一个串的概率分析:构造AC自动机之后,没随机生成一个字母,相当于在AC自动机中随机走一步.所有单词结点标记为"禁止",则本题就是求从结点0开始走L步,不进入任何静止结点的概率.d[i][j]表示当前在结点i,还要走j步,不碰到任何禁止结点的概率.在计算last的语句后面加一个val[u]|=val[f[u]],来计算禁止结点// File Name: 11468.cpp// Author: zlbing// Created Time: 2013/3 阅读全文
posted @ 2013-03-23 14:20 z.arbitrary 阅读(871) 评论(0) 推荐(0) 编辑
摘要: 刘汝佳新书---训练之南题意:求模板串中与文本串匹配最多次数的模板分析:使用AC自动机,因为模板串有相同的,故用map<string,int>来判重// File Name: 1449.cpp// Author: zlbing// Created Time: 2013/3/19 11:00:17#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include< 阅读全文
posted @ 2013-03-19 19:46 z.arbitrary 阅读(416) 评论(0) 推荐(0) 编辑
摘要: const int SIGMA_SIZE = 26;const int MAXNODE = 11000;const int MAXS = 150 + 10;map<string,int> ms;//ms是为了满足特殊要求,比如模板串相同时struct ACautomata { int ch[MAXNODE][SIGMA_SIZE]; int f[MAXNODE]; // fail函数 int val[MAXNODE]; // 每个字符串的结尾结点都有一个非0的val int last[MAXNODE]; // 输出链表的下一个结点 int cnt[MAXS]; int sz... 阅读全文
posted @ 2013-03-19 19:38 z.arbitrary 阅读(1244) 评论(0) 推荐(0) 编辑
摘要: #include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<cstring>#include<stack>#include<cmath>#include<queue>using namespace std;#define CL(x,v); m 阅读全文
posted @ 2013-03-18 14:05 z.arbitrary 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个长度为n的字符串,求它每个前缀的最短循环节分析:KMP的失配函数有一个特点,i表示前i个字符,若i%(i-f[i])==0,则前i个字符,最短循环节的长度为i-f[i]。。// File Name: 1328.cpp// Author: zlbing// Created Time: 2013/3/17 19:22:33#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set&g 阅读全文
posted @ 2013-03-17 20:05 z.arbitrary 阅读(174) 评论(0) 推荐(0) 编辑
摘要: //f[i+1]是求与p[i]的下一个匹配的后一个数的下标int f[MAXN];void getFail(char *p,int *f){ int m=strlen(p); f[0]=f[1]=0; for(int i=1;i<m;i++){ int j=f[i]; while(j&&p[i]!=p[j])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; }}void find(char *T,char *p,int *f){ int n=strlen(T); int m=strlen(p); ... 阅读全文
posted @ 2013-03-17 19:54 z.arbitrary 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 刘汝佳新书---------训练指南题意:求N个字符串两两比较,共比较了多少次?分析:将N个字符串插入前缀树,‘\0’也插入,这样就能区分字符串的终结点(以前我们都没插入)。这个很巧妙,不需要标识点标识字符终结点了,Orzz大牛!这样我们就能从前缀树中算出次数。字符串S1,S2的比较分这几种情况S1与S2的共同前缀S,则比较次数为len(S)*2+1但S1相同与S2,则比较次数为 len(S1+1)*2// File Name: 11732.cpp// Author: zlbing// Created Time: 2013/3/16 13:28:15#include<iostream&g 阅读全文
posted @ 2013-03-16 23:40 z.arbitrary 阅读(569) 评论(0) 推荐(0) 编辑
摘要: void out(int a) { if(a < 0) {putchar('-'); a = -a;} if(a >= 10)out(a / 10); putchar(a % 10 + '0'); } int in() { int flag = 1; char ch; int a = 0; while((ch = getchar()) == ' ' || ch == '\n'); if(ch == '-') flag = -1; else a += ch - '0'; whil... 阅读全文
posted @ 2013-03-16 15:53 z.arbitrary 阅读(474) 评论(0) 推荐(0) 编辑
摘要: import java.util.*;import java.math.*;public class Solution { public static void main(String args[]){ Scanner in=new Scanner(System.in); int a=in.nextInt(); int b=in.nextInt(); BigInteger x=BigInteger.valueOf(a); BigInteger y=BigInteger.valueOf(b); x=x.po... 阅读全文
posted @ 2013-03-14 20:36 z.arbitrary 阅读(215) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 22 下一页