zoukankan      html  css  js  c++  java
  • P4965 薇尔莉特的打字机

    题目背景

    只要客人有意向,不论身在何处,都能上门服务。我是自动手记人偶服务——薇尔莉特·伊芙加登。

    题目描述

    薇尔莉特的打字机用了太久,按键已经开始老化了,因此有时候按键会没有反应。而薇尔莉特总是盲打,因此按键没反应她也不会注意到。一天,她用这台打字机继续完成一封还没写完的信。

    现在告诉你这封信已经写好的部分以及薇尔莉特想进行的操作,薇尔莉特想进行的操作有两种:

    1. 在信的末尾输入一个大写字母
    2. 进行一次退格

    退格用小写字母 mathrm{u}u 表示,即删除当前信中的最后一个字符,当然,在信为空时退格没有任何作用。

    薇尔莉特会按顺序按下她想按的按键,而每次薇尔莉特按下一个键(输入一个大写字母或进行一次退格),都有可能没有反应(即这次操作无效)。请问,最后打出来的信有多少种可能呢?(空信也算信)

    当然薇尔莉特只想知道可能数对 0x125E591(十六进制) 取模的结果。

    输入输出格式

    输入格式:

     

    第一行两个正整数 n, mn, m 分别表示已经写好的信的长度和薇尔莉特想进行的操作数(字符个数+退格个数)。

    第二行一个长度为 nn 的字符串表示已经写好的信,保证该串中的每个字符都为大写字母。

    第三行一个长度为 mm 的字符串表示薇尔莉特想进行的操作,保证该串中的每个字符都为大写字母或 mathrm{u}u。

     

    输出格式:

     

    一个整数表示答案对 0x125E591 取模的结果。

     

    输入输出样例

    输入样例#1: 复制
    2 4
    AB
    AuAB
    输出样例#1: 复制
    9
    输入样例#2: 复制
    10 5
    AABBAACBAC
    ABAAC
    输出样例#2: 复制
    20
    输入样例#3: 复制
    1 3
    U
    uUu
    输出样例#3: 复制
    3

    说明

    1le n, mle 5 imes 10^61n, m5×106

    样例解释

    样例一:可能的 99 种信为:A,AA,AB,AAB,ABA,ABB,ABAA,ABAB,ABAAB

    样例二:太多了,略

    样例三:可能的 33 种信为:,U,UU

    这题的模数为什么这么奇怪应该不用我解释了

    注:在本文中序列加法定义为拼接两个序列成一个序列。如:{A,B}+{C}={A,B,C}{A,B}+{C}={A,B,C}

    思路

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 const int maxn=1e7+10;
     9 const int mod=0x125E591;
    10 
    11 char s[maxn],t[maxn];
    12 int n,m,list[300],pre[maxn],pos,cnt,dp[maxn],ans;
    13 int DP(char x)
    14 {
    15     if(list[x])
    16     {
    17         return mod-dp[pre[list[x]]];
    18     }
    19     else
    20     return 1;
    21 }
    22 int tot=0;
    23 
    24 int main()
    25 {
    26     memset(dp,0,sizeof(dp));
    27     int i;
    28     cin>>n>>m; 
    29     scanf("%s%s",s,t);
    30     for (i=0;i<m;++i)
    31     {
    32         if(t[i]=='u')
    33         {
    34             tot++;
    35         }
    36     }
    37     //cout<<cnt<<endl<<tot<<endl;
    38     for (i=m-1;i>=0;--i)
    39     {
    40         if (t[i]!='u')
    41         {
    42             pre[i]=pos;
    43             dp[i]=(2*dp[pos]+DP(t[i]))%mod;
    44             pos=list[t[i]]=i;
    45         }
    46         else
    47         {
    48             if (n-tot>=0) 
    49             {
    50                 ans=(ans+dp[pos]+DP(s[n-tot]))%mod;
    51             }
    52             --tot;
    53         }
    54     }
    55     ans=(ans+dp[pos]+1)%mod;
    56     cout<<ans<<endl;
    57     return 0;
    58 }
  • 相关阅读:
    Python Module_openpyxl_styles 样式处理
    Python Module_openpyxl_styles 样式处理
    Microsoft Azure_Fabric
    Keepalived概述和安装(1)
    LVS集群TUN模式实例(5)
    LVS集群DR模式实例(4)
    LVS集群之NAT模式实例(3)
    LVS集群之工作原理和调度算法(2)
    HDFS基于路由的Federation方案
    HDFS基于路由的Federation方案
  • 原文地址:https://www.cnblogs.com/2529102757ab/p/10913839.html
Copyright © 2011-2022 走看看