首页 > 其他分享 >test20230304考试总结(2023春 · 字符串)

test20230304考试总结(2023春 · 字符串)

时间:2023-03-11 14:24:12浏览次数:53  
标签:10 ch int rint test20230304 2023 字符串 define

前言

赛时得分明细:

A B C D Total Rank
100 100 0 70 270 2

C题如此说道:字符串没有学好的报应!!

A. P4391 [BOI2009]Radio Transmission 无线传输

题面

给定一个字符串 \(s_1\),它是由某个字符串 \(s_2\) 不断自我连接形成的(保证至少重复 \(2\) 次)。但是字符串 \(s_2\) 是不确定的,现在只想知道它的最短长度是多少。

\(L\) 为 \(s_1\) 的长度,所有数据点满足 \(1 < L \le 10^6\)

题解

答案为 \(n - fail(n)\),其中 \(fail\) 为 \(s_1\) 的失配函数。

证明:

如图,假设这两段是整个字符串ss的最大公共前后缀,我将前缀和后缀分开,令它们上下一一对应;

所以推出:

  1. 因为上下对应相等,故第1段等于红色段;

  2. 因为是公共前后缀,故第2段等于第1段;

  3. 因为上下对应相等,故第3段等于第2段;

  4. 因为是公共前后缀,故第4段等于第3段;

  5. ......

  6. 红色段就是循环子串;

红色段的长度即为 \(n - fail(n)\),征毕。

代码

#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 1e6 + 10;

int n, fail[N];

char s[N];

signed main() {
  n = read();
  cin >> s + 1;
  for (int i = 2, j = 0; i <= n; i++) {
    while(j && s[i] != s[j + 1]) j = fail[j];
    if(s[i] == s[j + 1]) j++;
    fail[i] = j;
  } 
  cout << n - fail[n] << '\n';
  return 0;
}

B. P4824 [USACO15FEB] Censoring S

题面

题解

代码

C. P4503 [CTSC2014] 企鹅 QQ

题面

题解

代码

D. P7469 [NOI Online 2021 提高组] 积木小赛

题面

给定两个长度为 \(n\) 的小写字母串 \(s\) 和 \(t\)。求在不同情况下从 \(s\) 中选出一个子序列与 \(t\) 中选出一个子串对应相同的方案数(两种情况不同,当且仅当两序列所选出的字符串在两种情况中不同)。

题解

枚举 \(t\) 的子串,固定左端点 \(L\),右端点 \(r\) 递增。同时在 \(s\) 中找是否有子序列与所枚举的字串对应相同。为了方便统计方案数,可以用 \(Hash\) 来判断两种情况是否相同。把 \(Hash\) 值丢到 \(unordered\)_\(set\),\(set\),或随便搞一个数组(之后进行 sort 和 unique)里面去。实测只有最后一个方法可以通过。

时间复杂度 \(O(N^2\log n)\)。

代码

#include <bits/stdc++.h>
#define int long long
#define H 37
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 3e3 + 10;
const int M = 9e6 + 10;

int n, hs, nxt[N][156], res[M], tot;

char s[N], t[N];

signed main() {
  n = read();
  For(i,1,n) cin >> s[i];
  For(i,1,n) cin >> t[i];
  For(i,1,n) {
    For(j,i,n) {
      if(!nxt[i][s[j]]) nxt[i][s[j]] = j;
    }
  }
  For(i,1,n) {
    hs = 0;
    int k = 1;
    For(j,i,n) { 
      k = nxt[k][t[j]];
      if(!k) break; 
      hs = 1ll * (hs * H) + (t[j] - 'a' + 1);
      res[++tot] = hs;
      k++;
    }
  }
  sort(res + 1, res + 1 + tot);
  cout << ((unique(res + 1, res + 1 + tot)) - res - 1) << '\n';
  return 0;
}

标签:10,ch,int,rint,test20230304,2023,字符串,define
From: https://www.cnblogs.com/Daniel-yao/p/17178282.html

相关文章

  • day11 打卡20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求
    day11打卡20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值20.有效的括号20题目链接1.本来使用的是Stack,时间2ms,内存39.6MB。而Deque时间......
  • 2023-3-10
    2023-3-101对下列各题中指定的集合\(A\),求出\(A^{\circ}\),\(\overline{A}\),\(\partialA\):​ (1)在\(\R\)中,\(A=\{1,\frac{1}{2},\frac{1}{3},\cdots......
  • js判断是否是字符串 instanceof
    exportfunctionisString(str){if(typeofstr==="string"||strinstanceofString){returntrue}returnfalse}conststr=newString('hello'......
  • 连网技术与网络管理 2023-03-11
    交换机DHCP防护,防止一个局域网里面,有2个DHCP误接入第二个路由器,就会导致多个DHCP.DHCP是应用层的协议  Wireshark分析DHCP_琳小白的博客-CSDN博客 IP地址,网络地......
  • 《渗透测试》算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护 2023 day8
           1数据在传输的时候为什么要进行编码   安全测试的时候往往会对url等地方进行修改、构造数据。数据传输的时候被编码的话,如果不按照对应编码......
  • 2023.03.11.函数重载,引用等
    程序生成的过程:1.预处理:头文件的展开宏的替换预处理指令解析去掉注释2.编译:预处理后文件生成汇编文件.asm(汇编代码)词法解析,语法解析语义分析优化3.汇编:汇编文件进一......
  • 2023国家线-考研人爱不释手的宝藏资源网站-搜嗖工具箱
    研招网https://yz.chsi.com.cn说起这个网站,想必考研的小伙伴都不陌生,研招网是教育部全国硕士研究生招生考试网上报名和网上调剂指定网站,既是各研究生招生单位的宣传咨询......
  • 2023.03.11.命名空间
    c++命名空间为了区分不同库中相同名称的函数、类、变量等命名空间的定义使用关键字namespace,后跟命名空间的名称,如下所示:namespacenamespace_name{//代码声明}为......
  • 程序设计应用 2023-03-11
     DjangodoessupporttheModel-View-Controller(MVC)architecturalpattern.However,DjangousesaslightlydifferentapproachcalledModel-View-Template(MV......
  • 2023/3/9每日总结
    跳转的实现MainActivity.classpackagecom.example.myapplication;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;importandroid.o......