ZOJ 2619 && HDU 3058

AC自动机通配符匹配 在计算机(软件)技术中,通配符可用于代替字符。 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符。(wiki百科) 今天做Leetcode上的一道题时不会做,网上查到了这么一种做法,当年打比赛的时候都没有碰到过。。。。 Leetcode Wildcard Matching 递归做法TLE class Solution { public: bool isMa 阅读详情

两道AC自动机+高消的求期望问题

先说HDU 3058

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
#define N 110
using namespace std;
int next[N][8],flag[N],fail[N],pos,tot,id[N];
int n;
char s[11];
double mat[110][110];

int newnode(){
    memset(next[pos],0,sizeof(next[pos]));
    flag[pos]=fail[pos]=0;
    return pos++;
}

void insert(){
    int p=0,i;
    for(i=0;s[i];i++){
        int k=s[i]-'A';
        p=next[p][k]?next[p][k]:next[p][k]=newnode();
    }
    flag[p]=1;
}

void makefail(){
    queue<int>q;
    q.push(0);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=0;i<n;i++){
            int v=next[u][i];
            if(v==0) next[u][i]=next[fail[u]][i];
            else q.push(v);
            if(u && v){
                fail[v]=next[fail[u]][i];
                flag[v]|=flag[fail[v]];
            }
        }
    }
}

void make_mat(){
    int i,j;
    tot=0;
    memset(id,0,sizeof(id));
    for(i=0;i<pos;i++)
        if(flag[i]==0) id[i]=tot++;
    memset(mat,0,sizeof(mat));
    for(i=0;i<pos;i++){
        if(flag[i]==1)continue;
        mat[id[i]][tot]=-n;
        mat[id[i]][id[i]]=-n;
        for(j=0;j<n;j++){
            int k=next[i][j];
            if(flag[k]==1)continue;
            mat[id[i]][id[k]]+=1.0;
        }
    }
}

bool gauss(){
    int i,j,row,id;
    double maxx;
    for(row=0;row<tot;row++){
        maxx=fabs(mat[row][row]);id=row;
        for(i=row+1;i<tot;i++)
            if(fabs(mat[i][row]>maxx)){
                maxx=fabs(mat[i][row]);
                id=i;
            }
        if(maxx<1e-11) return 0;    //我一开始这里精度设置1e-8就WA死了。。。。。。
        if(id!=row){
            for(j=0;j<=tot;j++)
                swap(mat[row][j],mat[id][j]);
        }
        for(i=row+1;i<tot;i++){
            for(j=tot;j>=row;j--)
                mat[i][j]-=mat[i][row]/mat[row][row]*mat[row][j];
        }
    }
    for(i=tot-1;i>=0;i--){
        for(j=i+1;j<tot;j++)
            mat[i][tot]-=mat[i][j]*mat[j][j];
        mat[i][i]=mat[i][tot]/mat[i][i];
    }
    return 1;
}

int main(){
    int t,T,m,i;
    scanf("%d",&T);
    for(t=1;t<=T;t++){
        scanf("%d %d",&n,&m);
        pos=0,newnode();
        for(i=1;i<=m;i++){
            scanf("%s",s);
            insert();
        }
        makefail();
        make_mat();
        gauss();
        printf("%.2lf\n",mat[0][0]);
    }
}

ZOJ 2619

具体数学上的结论题

#include <cstdio>
#include <cstring>
typedef long long ll;
using namespace std;
char s[410];

bool judge(int s1,int s2){
    while(s[s1] && s[s2]){
        if(s[s1]!=s[s2]) return 0;
        s1++,s2++;
    }
    return 1;
}

int main(){
    int t,T;
    int n,i;
    ll ans;
    scanf("%d",&T);
    for(t=1;t<=T;t++){
        scanf("%d %s",&n,s);
        ans=0;
        for(i=0;s[i];i++){
            if(judge(0,i)) ans++;
            ans*=n;
        }
        printf("Case %d:\n",t);
        printf("%lld\n",ans);
        if(t!=T)puts("");
    }
}

高消的做法(注意这里所有的变量都是整数,用long long的高消,用doube卡死精度)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
#define N 110
typedef long long ll;
using namespace std;
int next[N][26],flag[N],fail[N],pos,tot,id[N];
int n;
char s[21];
ll mat[110][110];

int newnode(){
    memset(next[pos],0,sizeof(next[pos]));
    flag[pos]=fail[pos]=0;
    return pos++;
}

void insert(){
    int p=0,i;
    for(i=0;s[i];i++){
        int k=s[i]-'A';
        p=next[p][k]?next[p][k]:next[p][k]=newnode();
    }
    flag[p]=1;
}

void makefail(){
    queue<int>q;
    q.push(0);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=0;i<n;i++){
            int v=next[u][i];
            if(v==0) next[u][i]=next[fail[u]][i];
            else q.push(v);
            if(u && v){
                fail[v]=next[fail[u]][i];
                flag[v]|=flag[fail[v]];
            }
        }
    }
}

void make_mat(){
    int i,j;
    tot=0;
    memset(id,0,sizeof(id));
    for(i=0;i<pos;i++)
        if(flag[i]==0) id[i]=tot++;
    memset(mat,0,sizeof(mat));
    for(i=0;i<pos;i++){
        if(flag[i]==1)continue;
        mat[id[i]][tot]=-n;
        mat[id[i]][id[i]]=-n;
        for(j=0;j<n;j++){
            int k=next[i][j];
            if(flag[k]==1)continue;
            mat[id[i]][id[k]]+=1;
        }
    }
    /*printf("%d\n",tot);
    printf("Matrix has %d rows and %d columns\n",tot,tot+1);
    for(i=0;i<tot;i++){
        for(j=0;j<=tot;j++) printf("%lld\t",mat[i][j]);
        puts("");
    }
    puts("*******");*/
}

ll gcd(ll a,ll b){
    if (b==0)
        return a;
    else return gcd(b,a%b);
}

bool gauss(){
    int i,j,row,id;
    ll maxx;
    for(row=0;row<tot;row++){
        maxx=abs(mat[row][row]),id=row;   //这里要挑一个小的移动,如果还是大的后面会溢出 或者干脆不移动也可以
        for(i=row+1;i<tot;i++)
            if(abs(mat[i][row]<maxx) && mat[i][row]){
                maxx=abs(mat[i][row]);
                id=i;
            }
        //if(maxx==0)continue;
        if(id!=row){
            for(j=0;j<=tot;j++)
                swap(mat[row][j],mat[id][j]);
        }
        for(i=row+1;i<tot;i++){
            if(mat[i][row]!=0){
                ll q=gcd(mat[i][row],mat[row][row]);
                ll gb=mat[i][row]*mat[row][row]/q;
                ll l1,l2;
                l1=gb/mat[i][row];
                l2=gb/mat[row][row];
                for(j=row;j<=tot;j++)
                   mat[i][j]=mat[i][j]*l1-mat[row][j]*l2;
            }
        }

        /*for(i=0;i<tot;i++){
            for(j=0;j<=tot;j++) printf("%lld\t",mat[i][j]);
            puts("");
        }
        puts("*******");*/

    }
    for(i=tot-1;i>=0;i--){
        for(j=i+1;j<tot;j++)
            mat[i][tot]-=mat[i][j]*mat[j][j];
        mat[i][i]=mat[i][tot]/mat[i][i];
    }
    return 1;
}

int main(){
    int t,T,m,i;
    //freopen("a.txt","r",stdin);
    //freopen("b.txt","w",stdout);
    scanf("%d",&T);
    for(t=1;t<=T;t++){
        scanf("%d",&n);
        pos=0,newnode();
        scanf("%s",s);
        insert();
        makefail();
        make_mat();
        gauss();
        printf("Case %d:\n",t);
        printf("%lld\n",mat[0][0]);
        if(t!=T) puts("");
    }
}


PTA-浙大版 《Python程序设计》 第三章编程题目及答案 博主第一次写优快云的博客,所以排版上可能有些不尽人意,代码部分均为自己的思路,可能复杂或者考虑欠妥,欢迎大家一起讨论~ 第一题:大于身高的平均值 这里用了np数组求得平均数,当然for循环累加也是可以的 import numpy as np data = input().split() data = list(map(int,data)) avg = np.mean(data) for i in data: if i > avg: print(i,end = ' 阅读详情

相关推荐

Carla-编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?

编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?不妨看看这个!

DSK_981029的博客 2573

HDU - 2619 Love you Ten thousand years (数论,原根)

Love you Ten thousand years Love you Ten thousand years------Earth's rotation is a day that is the representative of a day I love you. True love, there is no limit and no defects. Earth's revolution ...

Error Man 的博客 401

Win上通过Jconsole查看Java程序资源占用情况(教程总结,一篇就够了)

JConsole 是一个内置 Java 性能分析器,Java 5开始 引入了 JConsole。可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole来监控 Java 应用程序性能和跟踪 Java 中的代码。Jconsole工具查看程序的资源占用请求。安装jdk时bin目录有jconsole.exe工具,或者通过 Win + R,输入jconsole.exe启动jconsole( 可以从命令行直接输入jconsole。

明生的博客 6240

HDU 2619 完全剩余类 原根

求有多少$i(<=n-1)$,使 $x^i \mod n$的值为$[1,n-1]$,其实也就是满足完全剩余类的原根数量。之前好像在二次剩余的讲义PPT里看到这个过。 直接有个定理,如果模k下有原根,那么其原根总数为$\varphi(\varphi(k))$ /** @Date : 2017-09-21 19:22:16 * @FileName: HDU 2619 原根...

weixin_30466953的博客 159

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4845

ZOJ 2619 generator 【字符串+期望】

题目连接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1619 题目大意: 给定字符集大小,每次随机产生一个字符,直到出现给定的字符串时停止。问期望长度 解题思路: 不知很清楚为什么这么做,看了别人代码。具体数学上有证明,在第二版的401的8.4FLIPPING COINS上有证明,但是本人水平太渣了,没看懂

wh2124335的专栏 1041

同花顺Supermind量化交易 风险控制建模--海龟交易法则

A.市场与标的海龟交易法则应用于流动性高的市场中,选择交易量较大的标的进行交易。本文以沪深300指数ETF为标的,构建海龟交易法则。B、仓位:仓位是海龟交易系统最核心的部分,通过ATR真实波幅指标来管理仓位。第一步:计算True Range,简称TR。TR = Max ( H−L , H−P , P−L ) ,其中H为当日日内最高价,L为当日日内最低价,P为前一日收盘价。第二步:计算ATRATR = mean ( TR , 20 ) , 即计算过去20天的TR的平均值,ATR是TR的移动平均值。

qq_22808537的博客 1497

Generator zoj2619

这题和hdu3058要求差不多,只不过只有一个终止串,但正因为如此,生成的串长度期望也增加了,long double精度也不够了,之后网上看到解集全部是整数(为什么还没想通),所以可以用整数消元。 #include #include #include #include #include #include #include #include #include #i

霁月难逢 彩云易散 840

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

基于Simulink的雷达跟踪系统仿真(附源码)

此示例包含对雷达系统的基本特征进行建模的子系统。该模型是用于目标位置和速度检测的雷达系统的典型模型。该示例包括雷达脉冲发生器、射频发射器子系统、移动目标的 Simulink 表示、射频接收器和接收模块(Rx 模块)。

珞瑜的博客 3515

ZOJ - 2619 Generator 高斯消元

题目链接点这里 浮点数高斯消元精度爆炸,,long double 都卡不过去。。 因为只有一个串,,期望一定是整数,最后改成了整数高斯消元才过。。 #include using namespace std; #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f3f #define FIN freopen("input.txt","r",s

我们做的队 319

SAP ABAP 接口管理服务(ZIF)开源项目介绍

接口管理服务(ZIF)开源项目基于 SAP ABAP系统,是一款对标SAP PI/PO 的轻量接口管理产品。他通过独立开发包部署在ABAP系统中,包含接口注册、接口管理、日志服务及其他配套功能,拥有丰富的技术沉淀并通过市场检验,目前已被多家企业应用在SAP ERP系统中。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1740

generator

这个题目有两题一个是:la3490 即zoj2619 此题 还有一题是hdu3058 这个算是前一题的进阶版,但是其长度要段些。 然后说下此题解法,是参照俞勇的那本书写的。 先给出:然后说明如下: F【i】记为从i状态到达L状态期望的步数 c【i】【j】表示从i状态末尾加第j个大写字母后,得到的新状态是什么 然后做的时候由于除n有可能丢失精度,那么两边同时*n就好做了。 对于la349

lyc 920

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HDU - 3058 Generator AC自动机+高斯消元(未完待续)

题目链接点这里 高斯消元精度爆炸,,卡不过去了,, 网上博客里的代码也都wa了,,先放着吧。。 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #d

我们做的队 317

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HDU3058Nightmare Ⅱ( 双向广搜 )

题意:在n*m的迷宫里,你从M出发每次可以走三个单位,你的女朋友从G出发每次可以走一个单位,两个怪物从Z扩展,每次可以向周围扩展2个单位(忽略周围的一切)。问最小的步数,二人能够相遇。 解法: 双向BFS,从M,G分别广搜。遇到重叠即返回,下面应用风神的框架。 双向广搜 从初始结点和目标结点开始分别作两次BFS,每次选择队列中结点少的一边进行扩展,并且检测两边是否出现了状态重合//双向广搜代码

qwesde 757

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Generator hdu3058

trie图上递推+高斯消元, 卡精度题,代码挫了,C++过不了(long double也不行),G++可以过 , 对于结果比较大的数据会出错 比如   8 1 AAAAAAAAAAA 这组数据我的代码在C++和G++输出就不同,还有就是有double中的运算尽量应尽量避免除法运算,精度损失较大  #include #include #include #include #i

霁月难逢 彩云易散 947

ZOJ 2619 Generator (概率、AC自动机、高斯消元)

Generator 题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2619 题意:给定一个数N,代表可以选前N个字母。然后给定一个仅有前N个字母组成的字符串,问从空串开始构造,每次可以在已有基础上从前N个字母中挑选一个加在后面,问构造的字符串的长度期望是多少? 思路:如果给定的串长度为L,那么对

SIOFive的专栏 1688

HDU 4856 Tunnels(BFS+状压DP)

HDU 4856 Tunnels 题目链接 题意:给定一些管道,然后管道之间走是不用时间的,陆地上有障碍,陆地上走一步花费时间1,求遍历所有管道需要的最短时间,每个管道只能走一次 思路:先BFS预处理出两两管道的距离,然后状态压缩DP求解,dp[s][i]表示状态s,停在管道i时候的最小花费 代码: #include #include #include #inc

Remilia's 1731

【HDU 2619】Love you Ten thousand years

1.题目链接。原根的一个性。当a的阶等于phi(m)的时候,说明a是m的一个原根。首先这里原根的存在性是不用判断的,因为奇素数一定存在原根。当a是原根时,a^0,a^1,a^2....a^(odr(a))构成了一个关于m的简化剩余系。简单点就是说这个集合和{1,2,...odr(a)}这个集合相等。又因为m时质数,所以phi(m)=m-1。所以这个得到的简化剩余系就是{1,2,...m-1},只要...

YG爱木木 375

ZOJ 3058 The War(简单贪心)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4351 题目大意:有N个士兵,每个士兵所能拿动的武器为【minWi, maxWi】,为了能打胜战,要尽可能多的拿到武器。问你如何能拿到更多。 其实这题和那个活动时间安排极其相似。比较简单,排序就好了。#include #include #include #i

笨小孩的专栏 931

HDU 3058 Generator [AC自动机+期望DP]

  给出M个短串,这些短串由前N个大写字母组成。然后随机的按字符生成字符串,每次生成1~N个字符的概率是相等的,当生成串包含任意一个指定短串时,就停止生成。问生成串的长度的期望是多少。   首先建立Trie图,对每个可能作为短串结束的点都打上标记。用E(x)表示从这个点走到停止生成所需长度的期望。显然,对于打标记的点,E(x)=0。对于没打标记的点E(x)=∑(E(next[x][i])*1/N...

weixin_33857679的博客 193

HDU 2619 - Love you Ten thousand years (数论)

RT

一只冰熊 1252

zoj 2619 KMP+高斯消元+概率求期望

这道题一下子最对挺高兴的,发现自己最近敲代码之前总是发愣,很没效率啊!!! 用a[i]代表状态:尾部满足所给字符串长度i时为达到满足的字符串还所需要的期望。据此建立多元方程组然后进行高斯消元求解! ///////////////////////////////////////////////////////////////////////// // File Name: 13614.cpp /

生活总是要微笑着面对~ 1267

hdu 2619 Love you Ten thousand years(数论,待解决)

Love you Ten thousand years Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 92    Accepted Submission(s): 34 Problem Description Lo

TUT我好菜啊 774

Codeforces 163E && HDU 4117 && Noi2011阿狸的打字机 && boj 1602

http://codeforces.com/problemset/problem/163/E http://acm.hdu.edu.cn/showproblem.php?pid=4117 http://61.187.179.132/JudgeOnline/problem.php?id=2434 http://n.boj.me/onlinejudge/newoj/showProblem/show_problem.php?problem_id=1602 这四道题均为用数据结构维护的AC自动机。 基本想法是建好A

1292765944的专栏 1911
上一篇: uva 11137
下一篇: 对差分约束问题的理解
Benzema67
博客等级 码龄15年 120粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值