STM32学习之路-外部中断(1)

今天起得比较晚,又浪费了点时间,真可耻。。

下午又为校赛出了俩题,至此,校赛的四道题目已经完毕。又检查了一番,没有错误,就等待着明天的汇总了~。

AC自动机的题目今天就刷了三道,还是没有完成之前的目标。现在vj也进不去了,想通宵,都不给机会~~

只能等明天再刷完了,拖延不是一个好习惯。

----------------------------------------------------------------------------------------------------------

1,hdu-4511-小明系列故事――女友的考验

抢了CZ的FB,心里很高兴,哈哈

AC自动机越来越模板了,就先创建非法路径的自动机。然后再树上求1点到n点的最短路。我当时没有注意要“只能走到比当前所在点编号大的位置; ”的条件,错了N次,伤心。。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<string.h>
#include<math.h>
using namespace std;
#define LL __int64
#define maxn 55
const int maxnode=110*5;
const int childnum=55;
const int mod=1000000007;
const int INF=99999999;
struct list
{
    double  x;
    double y;
}node[maxn];
struct listt
{
    int p;
    int t;
    double dis;
    friend bool operator <(const listt &a,const listt &b)
    {
        return a.dis>b.dis;
    }
}pp,qq;
double dist(int x,int y)
{
    double xx,yy;
    xx=node[x].x-node[y].x;
    yy=node[x].y-node[y].y;
    double sum=xx*xx+yy*yy;
    return 1.0*sqrt(1.0*sum);
}
priority_queue<listt>que;
struct ac_tree
{
    int chd[maxnode][childnum];
    int val[maxnode];
    int fail[maxnode];
    int key[1<<11];
    int Q[maxnode];
    int ID[128];
    int sz;
    int vis[maxn][maxnode];
    void init()
    {
        fail[0]=0;
        for(int i=0;i<childnum;i++)
        {
            ID[i]=i;
        }
    }
    void reset()
    {
        memset(chd,0,sizeof(chd));
        sz=1;
    }
    void insert(vector<int>vec,int k)
    {
        int p=0;
        int len=vec.size();
        for(int i=0;i<len;i++)
        {
            int c=ID[vec[i]];
            if(!chd[p][c])
            {
                memset(chd[sz],0,sizeof(chd[sz]));
                val[sz]=0;
                chd[p][c]=sz++;
            }
            p=chd[p][c];
        }
        val[p]=k;
    }
    void ac_build()
    {
        int *s=Q,*e=Q;
        for(int i=1;i<childnum;i++)
        {
            if(chd[0][i])
            {
                fail[chd[0][i]]=0;
                *e++=chd[0][i];
            }
        }
        while(s!=e)
        {
            int u=*s++;
            if(val[fail[u]])val[u]+=val[fail[u]];
            for(int i=1;i<childnum;i++)
            {
                int &v=chd[u][i];
                if(v)
                {
                    *e++=v;
                    fail[v]=chd[fail[u]][i];
                  //  val[v]=(val[v]+val[fail[v]]);
                }
                else v=chd[fail[u]][i];
            }
        }
    }
    int word(int n)
    {
        while(!que.empty())que.pop();
        memset(vis,0,sizeof(vis));
        pp.p=1;
        pp.t=chd[0][1];
        pp.dis=0.0;
        que.push(pp);
        int cr;
        vis[1][pp.t]=1;
        while(!que.empty())
        {
            pp=que.top();
            que.pop();
          //  cout<<"____________"<<endl;
           // cout<<pp.p<<endl;
            if(pp.p==n)
            {
                printf("%.2f\n",pp.dis);
                return 0;
            }
            for(int i=pp.p+1;i<=n;i++)
            {
                cr=chd[pp.t][i];
                if(i==pp.p)continue;
                if(val[cr])continue;
                //if(vis[i][cr])continue;
               // cout<<pp.p<<" "<<i<<" "<<cr<<endl;
                vis[i][cr]=1;
                qq.p=i;
                qq.t=cr;
                qq.dis=1.0*pp.dis+1.0*dist(pp.p,qq.p);
                que.push(qq);
            }
        }
        cout<<"Can not be reached!"<<endl;
    }
}AC;
char temp[155];
int main()
{
    AC.init();
    int n,m,k,x;
    int T;
    while(~scanf("%d%d",&n,&m))
    {
        if(!(n||m))break;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&node[i].x,&node[i].y);
        }
        AC.reset();
        vector<int>vec;
        for(int i=1;i<=m;i++)
        {
            vec.clear();
            scanf("%d",&k);
            while(k--)
            {
                scanf("%d",&x);
                vec.push_back(x);
            }
            AC.insert(vec,1);
        }
        AC.ac_build();
        AC.word(n);
    }
    return 0;
}

2,hdu-4758-Walk Through Squares

1.对自动机上每个状态dp,dp[a][b][c][d]表示经过了a个字符,匹配了b个R,在c这个状态,d是4进制数,表示是否经过串1和串2

也就是一个树上DP,想好状态转移方程就好了。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define LL int
const int maxnode=101*2;
const int childnum=2;
const int mod=1000000007;
const int INF=99999999;
struct ac_tree
{
    int chd[maxnode][childnum];
    int val[maxnode];
    int fail[maxnode];
    int key[1<<11];
    int Q[maxnode];
    int ID[128];
    int sz;
    int dp[104][104][maxnode][4];
    void init()
    {
        fail[0]=0;
        for(int i=0;i<childnum;i++)
        {
            ID[i+‘a‘]=i;
        }
        ID[‘R‘]=0;ID[‘D‘]=1;
    }
    void reset()
    {
        memset(chd,0,sizeof(chd));
        sz=1;
    }
    void insert(char str[],int k)
    {
        int p=0;
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            int c=ID[str[i]];
            if(!chd[p][c])
            {
                memset(chd[sz],0,sizeof(chd[sz]));
                val[sz]=0;
                chd[p][c]=sz++;
            }
            p=chd[p][c];
        }
        val[p]=k;
    }
    void ac_build()
    {
        int *s=Q,*e=Q;
        for(int i=0;i<childnum;i++)
        {
            if(chd[0][i])
            {
                fail[chd[0][i]]=0;
                *e++=chd[0][i];
            }
        }
        while(s!=e)
        {
            int u=*s++;
          //  if(val[fail[u]])val[u]|=val[fail[u]];
            for(int i=0;i<childnum;i++)
            {
                int &v=chd[u][i];
                if(v)
                {
                    *e++=v;
                    fail[v]=chd[fail[u]][i];
                    val[v]=(val[v]|val[fail[v]]);
                }
                else v=chd[fail[u]][i];
            }
        }
    }
    int word(int n,int m)
    {
        memset(dp,0,sizeof(dp));
        dp[0][0][0][0]=1;
        int cr;
        int t;
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                for(int k=0;k<sz;k++)
                {
                    for(int z=0;z<4;z++)
                    {
                        if(dp[i][j][k][z]==0)continue;
                       // dp[i][j][k][z]%=mod;
                    //    cout<<i<<" "<<j<<" "<<k<<" "<<z<<endl;
                        cr=chd[k][0];
                        t=z|val[cr];
                        dp[i+1][j][cr][t]+=dp[i][j][k][z];
                        dp[i+1][j][cr][t]%=mod;
                        cr=chd[k][1];
                        t=z|val[cr];
                        dp[i][j+1][cr][t]+=dp[i][j][k][z];
                        dp[i][j+1][cr][t]%=mod;
                    }
                }
            }
        }
        int ans=0;
        for(int i=0;i<sz;i++)
        {
            ans+=dp[n][m][i][3];
            ans%=mod;
        }
        ans=ans%mod;
        cout<<ans<<endl;
    }
}AC;
char temp[155];
int main()
{
    AC.init();
    int n,m,k;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        AC.reset();
        for(int i=1;i<=2;i++)
        {
            scanf("%s",temp);
            AC.insert(temp,(1<<(i-1)));
        }
        AC.ac_build();
        AC.word(n,m);
    }
    return 0;
}

3,hdu-4057- Rescue the Rabbit

dp[i][j][k],表示长度为i的串,位于Trie上的状态j,模式串的状态为k的最大价值。

状态压缩一下,就变成了普通的树上DP了,还需要滚动数组压缩一下空间。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int maxnode=101*10;
const int childnum=4;
const int mod=20090717;
const int INF=99999999;
struct ac_tree
{
    int chd[maxnode][childnum];
    int val[maxnode];
    int fail[maxnode];
    int key[1<<11];
    int Q[maxnode];
    int ID[128];
    int sz;
    int dp[2][maxnode][1<<10];
    void init()
    {
        fail[0]=0;
        for(int i=0;i<childnum;i++)
        {
            ID[i+‘a‘]=i;
        }
        ID[‘A‘]=0;ID[‘T‘]=1;
        ID[‘G‘]=2;ID[‘C‘]=3;
    }
    void reset()
    {
        memset(chd,0,sizeof(chd));
        sz=1;
    }
    void insert(char str[],int k,int d)
    {
        key[k]=d;
        int p=0;
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            int c=ID[str[i]];
            if(!chd[p][c])
            {
                memset(chd[sz],0,sizeof(chd[sz]));
                val[sz]=0;
                chd[p][c]=sz++;
            }
            p=chd[p][c];
        }
        val[p]=k;
    }
    void ac_build()
    {
        int *s=Q,*e=Q;
        for(int i=0;i<childnum;i++)
        {
            if(chd[0][i])
            {
                fail[chd[0][i]]=0;
                *e++=chd[0][i];
            }
        }
        while(s!=e)
        {
            int u=*s++;
          //  if(val[fail[u]])val[u]|=val[fail[u]];
            for(int i=0;i<childnum;i++)
            {
                int &v=chd[u][i];
                if(v)
                {
                    *e++=v;
                    fail[v]=chd[fail[u]][i];
                    val[v]=(val[v]|val[fail[v]]);
                }
                else v=chd[fail[u]][i];
            }
        }
    }
    int word(int n,int m)
    {
        int s=0;
        int l=1;
        int tai=(1<<m);
        int cr,tr;
        memset(dp,0,sizeof(dp));
        dp[0][0][0]=1;
        for(int i=0;i<n;i++)
        {
            l=1-s;
            memset(dp[l],0,sizeof(dp[l]));
           // cout<<"__"<<endl;
            for(int j=0;j<sz;j++)
            {
                for(int k=0;k<tai;k++)
                {
                    if(dp[s][j][k]==0)continue;
                    //cout<<j<<" "<<k<<endl;
                    for(int z=0;z<childnum;z++)
                    {
                        cr=chd[j][z];
                      //  cout<<j<<"+"<<z<<"="<<cr<<endl;
                        tr=val[cr]|k;
                        dp[l][cr][tr]=1;
                    }
                }
            }
            s=l;
        }
        int maxx=-1;
        int tt=0;
        for(int j=0;j<sz;j++)
        {
            for(int k=0;k<tai;k++)
            {
                if(dp[s][j][k]==0)continue;
               // cout<<j<<" "<<k<<endl;
                tt=0;
                for(int i=0;i<m;i++)
                {
                    if(k&(1<<i))tt+=key[1<<i];
                }
                maxx=max(tt,maxx);
            }
        }
        if(maxx<0)cout<<"No Rabbit after 2012!"<<endl;
        else cout<<maxx<<endl;
    }
}AC;
char temp[155];
int main()
{
    AC.init();
    int n,m,k;
    while(~scanf("%d%d",&n,&m))
    {
        AC.reset();
        for(int i=1;i<=n;i++)
        {
            scanf("%s %d",temp,&k);
            AC.insert(temp,(1<<(i-1)),k);
        }
        AC.ac_build();
        AC.word(m,n);
    }
    return 0;
}

STM32学习之路-外部中断(1)

时间: 2024-12-18 04:20:39

STM32学习之路-外部中断(1)的相关文章

STM32学习之路-外部中断(2)

OK,继续上篇的内容. 配置好外部中断源以后, 就得使能外部中断线了. 为了方便看再借下这个图: 对外部中断的使能其实就是配置上面这些寄存器.即使能哪EXIT线,选择上面模式,是中断还是事件,选择下降沿还是上升沿. 具体怎么写寄存器这就不研究了, = = 太麻烦了.. 直接用STM32的库就行了,来看看它的代码吧 这是EXTI结构体的初始化函数, void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) { EXTI_InitStruct->

STM32学习之路-按键中断测试(外部中断)

终于有时间再来学习STM32了~ 这几天都在忙着该死的考试.直接进入正题 开发板:奋斗V5 这个按键中断测试的要求是:按键2(K2)按下,LED2(V7)亮, 再一次按下就灭,循环.. 好,先看看按键和LED的原理图 好吧~ 虽然图截得不是很好看,但是能看到K2接的是PC2, LED2接的是PD6 ok,剩下的就是配置工作了.. 先来理一理思路: (1)初始化系统时钟 (2)初始化外部时钟(你所用到的东西) (3)配置LED (4)配置中断优先级 (5)配置外部中断线 (6)中断处理函数 恩,差

STM32学习笔记(九) 外部中断,待机模式和事件唤醒

学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为例详细讲解这些内容,希望对每一个阅读者有帮助. 1.外部中断 如果已经学习了SysTick系统时钟滴答实验,掌握了Cortex-M3中断的相关知识,那么外部中断也是比较好理解的,和SysTick中断一样,外部中断也是当有信号触发时,如果中断屏蔽寄存器允许触发,就会产生中断,这时CPU查找中断向量表,

STM32学习之路-不得不说的SysTick时钟

SysTick时钟,俗称"嘀嗒定时器",这家伙能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 是它,是它,就是它,红色框里的东东,可以看到,它是由HCLK/8得到的,也就是:72MHz/8=9MHz 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看看9000是怎么来的,这里要看下SysTick寄

STM32学习之路-中断优先级&lt;NIVC(2)&gt;

优先级的问题可以分为以下情况: 抢占优先级和响应优先级 (1)抢占优先级高的可以打断抢占优先级低的,形成嵌套. (2)抢占优先级相同时,看响应优先级.如果两个中断前后发生的话,后来的中断不能打断前一个中断 只能等,如果两个中断同时发生的话,则响应优先级高的先响应. (3)抢占级别和响应级别都一样时,按照中断的地址来响应,地址低的先响应 这样就解决了优先级的问题. 哪个级别高呢?  0>1>2>...... STM32共有5组分别是0-4组,还是借那个图 可以看到第4组所有的位都用来设置抢

STM32学习之路-LCD驱动(1)&lt;基础知识&gt;

[1]以下关于 JVM 的叙述,哪些项正确? A.JVM 运行于操作系统之上,它依赖于操作系统 B.JVM 运行于操作系统之上,它与操作系统无关 C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件 D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件 扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件 扩展名为.class的是字节码文件(二进制):系统运行时执行的文件 [2]下列选项中正确的表达式是: A.byte b = 128; 

STM32学习之路-LCD(2)&lt;LCD初始化&gt;

这些天一直在研究LCD的初始化函数,因为不过是用IO口模拟时序还是用FSMC来驱动LCD,都必须要弄好LCD的初始化 其实LCD的初始化就是跟着LCD IC的datasheet来写寄存器,大部分都使用上面的默认值,网上有很多修改的例子,这里就不 放出来了.但是我想写下一些比较重要的东西. 这是从网上下载来的一个文件的前半部分: 当然,别的型号的IC也是有这些东西的,不过可能有些地址不同而已. R0,这个命令有两个功能,如果对它写,则最低位为OSC,用于开启和关闭振荡器.而如果对它读操作, 则返回

STM32学习之路-LCD(3)&lt;显示图片&gt;

祝大家端午和六一快乐!原本今天是想休息休息的,但是实在无奈没什么事干.所以就来学习学习LCD显示图片的函数 函数是照搬奋斗的例子,算是些笔记吧.不过奋斗的例子注释的不是很详细.今天去看了正点原子的论坛,唉..瞬间感觉正点原子做得真的很好 能把所有的资料都开源,并且论坛上大多问题都耐心的解答了.这实在是非常非常好的售后服务了!!自己也偷偷的去下了写资料来看看,(*^__^*) 嘻嘻-- 好,进入主题: 开发板:奋斗V5 LCD:3寸 400X240 直接上代码吧 void lcd_DrawPict

stm32中断优先级管理与外部中断编程

stm32中断优先级管理与外部中断编程 中断优先级管理 外部中断编程 原文地址:https://www.cnblogs.com/-wenli/p/10633445.html