bupt summer training for 16 #8 ——字符串处理

https://vjudge.net/contest/175596#overview

 

A.设第i次出现的位置左右端点分别为Li,Ri

初始化L0 = 0,则有ans = sum{ (L[i] - L[i-1]) * (n + 1 - Ri) }

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 int last = 0;
 9 
10 char s[5010];
11 
12 long long ans;
13 
14 int main() {
15     scanf("%s", s + 1);
16     int n = strlen(s + 1);
17     for(int i = 1;i <= n;i ++) {
18         if(i + 3 <= n && s[i] == 'b' && s[i + 1] == 'e' && s[i + 2] == 'a' && s[i + 3] == 'r') {
19             ans += 1ll * (i - last) * (n + 1 - i - 3);
20             last = i;
21             i += 3;
22         }
23     }
24     cout << ans;
25     return 0;
26 }
View Code

 

B.AC自动机板子题,我的板子常数很大

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 500010;
 8 
 9 struct trie {
10     int next[maxn][26], fail[maxn], end[maxn];
11     int L, root;
12     queue <int> q;
13 
14     int newnode() {
15         for(int i = 0;i < 26;i ++)
16             next[L][i] = -1;
17         end[L] = 0;
18         return L ++;
19     }
20 
21     void clear() {
22         L = 0;
23         root = newnode();
24     }
25 
26     int idx(char c) {
27         return c - 'a';
28     }
29 
30     void insert(char *buf) {
31         int len = strlen(buf), now = root, c;
32         for(int i = 0;i < len;i ++) {
33             c = idx(buf[i]);
34             if(next[now][c] == -1)
35                 next[now][c] = newnode();
36             now = next[now][c];
37         }
38         end[now] ++;
39     }
40 
41     void build() {
42         for(int i = 0;i < 26;i ++) {
43             if(next[root][i] == -1)
44                 next[root][i] = root;
45             else {
46                 fail[next[root][i]] = root;
47                 q.push(next[root][i]);
48             }
49         }
50         while(!q.empty()) {
51             int now = q.front();
52             q.pop();
53             for(int i = 0;i < 26;i ++) {
54                 if(next[now][i] == -1)
55                     next[now][i] = next[fail[now]][i];
56                 else {
57                     fail[next[now][i]] =  next[fail[now]][i];
58                     q.push(next[now][i]);
59                 }
60             }
61         }
62     }
63 
64     int query(char *buf) {
65         int len = strlen(buf), now = root, res = 0, tmp;
66         for(int i = 0;i < len;i ++) {
67             tmp = now = next[now][idx(buf[i])];
68             while(tmp != root) {
69                 res += end[tmp];
70                 end[tmp] = 0;
71                 tmp = fail[tmp];
72             }
73         }
74         return res;
75     }
76 };
77 
78 trie ac;
79 
80 int Case, n;
81 
82 char buf[1000010];
83 
84 int main() {
85     scanf("%d", &Case);
86     while(Case --) {
87         scanf("%d", &n), ac.clear();
88         while(n --) scanf("%s", buf), ac.insert(buf);
89         scanf("%s", buf), ac.build();
90         printf("%d\n", ac.query(buf));
91     }
92     return 0;
93 }
View Code

 

C.考察对KMP中next数组的理解,由一个串重复而来

所以就是max(i - next[i])

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 char s[1000010];
 8 
 9 int nex[1000010];
10 
11 int main() {
12     int i, j, ans, len;
13     while(~scanf("%s", s)) {
14         len = strlen(s);
15         nex[0] = -1;
16         ans = 0;
17         for(i = 1;i < len;i ++) {
18             j = nex[i - 1];
19             while(j >= 0 && s[j + 1] != s[i]) j = nex[j];
20             if(s[j + 1] == s[i]) {
21                 nex[i] = j + 1;
22                 ans = max(ans, i - nex[i]);
23             }
24             else nex[i] = -1, ans = max(ans, i + 1);
25         }
26         printf("%d\n", ans);
27     }
28     return 0;
29 }
View Code

 

D.令a[i] -= a[i + 1],题目就变成了

求数列中出现次数不小于2次的最长重复子串

后缀数组一个典型问题,二分子串长度即可

(考场上观察了半天手里板子的接口...然后放弃了)

 

E.先假设要由空串刷成串2,区间DP即可

dp[i][j]代表把 i-j 这段刷成串2需要的最少次数

可能分成几段分开去刷,所以不能直接ans = dp[L][R] (s1[L] != s2[L],s1[R] != s2[R])

利用f[i]代表 1-i 这段由串1刷成串2的最少次数

ans = f[n]

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int n, dp[110][110], f[110];
 8 
 9 char s1[110], s2[110];
10 
11 int main() {
12     while(~scanf("%s %s", s1 + 1, s2 + 1)) {
13         n = strlen(s1 + 1);
14         memset(dp, 0x3f, sizeof dp);
15         for(int d = 1;d <= n;d ++)
16             for(int i = 1;i + d - 1 <= n;i ++) {
17                 int j = i + d - 1;
18                 if(i == j) dp[i][i] = 1;
19                 else if(j == i + 1) dp[i][j] = 2 - (s2[i] == s2[j]);
20                 else {
21                     for(int k = i;k < j;k ++)
22                         dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] - (s2[i] == s2[k + 1]));
23                 }
24             }
25         for(int i = 1;i <= n;i ++) {
26             f[i] = dp[1][i];
27             if(s1[i] == s2[i]) f[i] = min(f[i - 1], f[i]);
28             else 
29                 for(int j = 1;j < i;j ++)
30                     f[i] = min(f[i],  f[j] + dp[j + 1][i]);
31         }
32         printf("%d\n", f[n]);
33     }
34     return 0;
35 }
View Code

 

F.简单的字典树

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int maxn = 6000010;
 5 
 6 struct trie {
 7     int ch[maxn][2];
 8     int val[maxn];
 9     int siz;
10 
11     void init() {
12         siz = 1;
13         memset(ch, 0, sizeof ch);
14         memset(val, 0, sizeof val);
15     }
16 
17     void insert(int x) {
18         int i, u, c;
19         int num[40] = {0};
20         for(i = 0;i < 30;i ++)
21             num[i] = x & (1 << i);
22         for(i = u = 0;i < 30;i ++) {
23             c = (num[29 - i] != 0);
24             if(!ch[u][c]) ch[u][c] = siz ++;
25             u = ch[u][c], val[u] ++;
26         }
27         val[0] ++;
28     }
29 
30     void de1ete(int x) {
31         int i, u, c;
32         int num[40] = {0};
33         for(i = 0;i < 30;i ++)
34             num[i] = x & (1 << i);
35         for(i = u = 0;i < 30;i ++) {
36             u = ch[u][(num[29 - i] != 0)];
37             val[u] --;
38         }
39         val[0] --;
40     }
41 
42     void query(int x) {
43         int i, u, c, ans = 0;
44         int num[40] = {0};
45         for(i = 0;i < 30;i ++)
46             num[i] = x & (1 << i);
47         for(i = u = 0;i < 30;i ++) {
48             c = !(num[29 - i] != 0);
49             if(ch[u][c] && val[ch[u][c]]) ans |= (1 << (29 - i)), u = ch[u][c];
50             else u = ch[u][!c];
51         }
52         printf("%d\n", ans);
53     }
54 };
55 
56 trie now;
57 
58 int n, x;
59 
60 char str[5];
61 
62 int main() {
63     now.init();
64     now.insert(0);
65     scanf("%d", &n);
66     while(n --) {
67         scanf("%s %d", str, &x);
68         switch(str[0]) {
69             case '+':now.insert(x);break;
70             case '-':now.de1ete(x);break;
71             case '?':now.query(x);break;
72         }
73     }
74     return 0;
75 }
View Code

 

G.

 

H.

 

I.

 

J.

 

K.最长回文子串,直接上马拉车

板子不长,mp[i] - 1 表示以 i 为中心的最长回文串长度

 1 #include <map>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 const int maxn = 1000010;
 9 
10 char str[3], s[maxn], ma[maxn], ans[maxn];
11 
12 int mp[maxn], l, len;
13 
14 map <char, char> p;
15 
16 void manacher() {
17     l = 0;
18     ma[l ++] = '$';
19     ma[l ++] = '#';
20     for(int i = 0;i < len;i ++)
21         ma[l ++] = s[i], ma[l ++] = '#';
22     ma[l] = 0;
23     int mx = 0, id = 0;
24     for(int i = 0;i < l;i ++) {
25         mp[i] = mx > i ? min(mp[2 * id - i], mx - i) : 1;
26         while(ma[i + mp[i]] == ma[i - mp[i]]) mp[i] ++;
27         if(i + mp[i] > mx) mx = i + mp[i], id = i;
28     }
29 }
30 
31 int main() {
32     while(~scanf("%s %s", str, s)) {
33         len = strlen(s);
34         manacher();
35         int leng = 0, pos = -1;
36         for(int i = 0;i < l;i ++)
37             if(mp[i] > leng)
38                 leng = mp[i], pos = i;
39         leng --;
40         if(leng == 1) {
41             puts("No solution!");
42             continue;
43         }
44         if(pos & 1) {
45             printf("%d %d\n", pos / 2 - leng / 2, pos / 2 - leng / 2 + leng - 1);
46             for(int i = pos / 2 - leng / 2, j = 1;j <= leng;i ++, j ++)
47                 ans[j] = s[i];
48         }
49         else {
50             printf("%d %d\n", pos / 2 - leng / 2 - 1, pos / 2 - leng / 2 + leng - 2);
51             for(int i = pos / 2 - leng / 2 - 1, j = 1;j <= leng;i ++, j ++)
52                 ans[j] = s[i];
53         }
54         ans[leng + 1] = 0;
55         int dis = 'a' - str[0];
56         for(int i = 0;i < 26;i ++)
57             p['a' + i] = 'a' + (i + dis + 26) % 26;
58         for(int i = 1;i <= leng;i ++)
59             ans[i] = p[ans[i]];
60         puts(ans + 1);
61     }
62     return 0;
63 }
View Code

 

L.变换同D题,然后就是裸的KMP了

 1 #include <map>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 const int maxn = 1000010;
 9 
10 char str[3], s[maxn], ma[maxn], ans[maxn];
11 
12 int mp[maxn], l, len;
13 
14 map <char, char> p;
15 
16 void manacher() {
17     l = 0;
18     ma[l ++] = '$';
19     ma[l ++] = '#';
20     for(int i = 0;i < len;i ++)
21         ma[l ++] = s[i], ma[l ++] = '#';
22     ma[l] = 0;
23     int mx = 0, id = 0;
24     for(int i = 0;i < l;i ++) {
25         mp[i] = mx > i ? min(mp[2 * id - i], mx - i) : 1;
26         while(ma[i + mp[i]] == ma[i - mp[i]]) mp[i] ++;
27         if(i + mp[i] > mx) mx = i + mp[i], id = i;
28     }
29 }
30 
31 int main() {
32     while(~scanf("%s %s", str, s)) {
33         len = strlen(s);
34         manacher();
35         int leng = 0, pos = -1;
36         for(int i = 0;i < l;i ++)
37             if(mp[i] > leng)
38                 leng = mp[i], pos = i;
39         leng --;
40         if(leng == 1) {
41             puts("No solution!");
42             continue;
43         }
44         if(pos & 1) {
45             printf("%d %d\n", pos / 2 - leng / 2, pos / 2 - leng / 2 + leng - 1);
46             for(int i = pos / 2 - leng / 2, j = 1;j <= leng;i ++, j ++)
47                 ans[j] = s[i];
48         }
49         else {
50             printf("%d %d\n", pos / 2 - leng / 2 - 1, pos / 2 - leng / 2 + leng - 2);
51             for(int i = pos / 2 - leng / 2 - 1, j = 1;j <= leng;i ++, j ++)
52                 ans[j] = s[i];
53         }
54         ans[leng + 1] = 0;
55         int dis = 'a' - str[0];
56         for(int i = 0;i < 26;i ++)
57             p['a' + i] = 'a' + (i + dis + 26) % 26;
58         for(int i = 1;i <= leng;i ++)
59             ans[i] = p[ans[i]];
60         puts(ans + 1);
61     }
62     return 0;
63 }
View Code

转载于:https://www.cnblogs.com/ytytzzz/p/7275492.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员必须知道的HTML常用代码有哪些?

HTML即超文本标记语言&#xff0c;是目前应用最为广泛的语言之一&#xff0c;是组成一个网页的主要语言。在现今这个HTML5华丽丽地占领了整个互联网的时候&#xff0c;如果想要通过网页抓住浏览者的眼球光靠因循守旧是不行的&#xff0c;程序猿们需要掌握一些必须知道的HTML常用…

公用ip地址查询_是什么使您无法更改公用IP地址并在Internet上造成严重破坏?

公用ip地址查询What exactly is preventing you (or anyone else) from changing their IP address and causing all sorts of headaches for ISPs and other Internet users? 到底是什么在阻止您(或其他任何人)更改其IP地址并导致ISP和其他Internet用户感到头疼&#xff1f; …

Vim的新一代补全插件:coc.nvim

coc.nvim可以同时在nvim和vim8.1上使用。 安装 参考官方&#xff1a;Install coc.nvim 推荐使用vim-plug插件管理器&#xff0c;在vimrc中添加&#xff1a; Plug neoclide/coc.nvim, {do: { -> coc#util#install()}} 然后输入命令:PlugInstall 等待插件下载&#xff0c;再等…

C++STL——概述

一、相关介绍 STL 标准模板库在编写代码的过程中有一些程序经常会被用到&#xff0c;而且需求特别稳定&#xff0c;所以C中把这些常用的模板做了统一的规范&#xff0c;慢慢的就形成了STL提供三种类型的组件: 容器、迭代器和算法&#xff0c;它们都支持泛型程序设计标准容器 顺…

固态硬盘可靠性_您可以通过使用较少的总容量来提高硬盘的可靠性吗?

固态硬盘可靠性Your computer has a massive hard drive that you significantly underuse. Would decreasing the size of the primary partition actually increase the lifespan of the drive? 您的计算机具有大量未充分使用的巨大硬盘驱动器。 减小主分区的大小是否会真正…

接收上传的multi-file的文件(四)

构建工程 为例创建一个springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依赖。为例能够上传文件在服务器&#xff0c;你需要在web.xml中加入标签做相关的配置&#xff0c;但在sringboot 工程中&#xff0c;它已经为你自动做了&#xff0c;所…

数据库读写分离 - MyBatis

2019独角兽企业重金招聘Python工程师标准>>> 由于项目中数据量较大&#xff0c;访问量也较高&#xff0c;故在数据库的设计上&#xff0c;采用读写分离思想&#xff0c;达到性能要求&#xff01; 简单科普一下实现读写分离的思路 配置及加载数据库信息&#xff0c;即…

t-mobile频段_T-Mobile再次被黑客入侵:超过200万个帐号和地址可能泄漏

t-mobile频段Attackers may have compromised three percent of T-Mobile’s 77 million customers on Monday, revealing personal information like addresses, phone numbers, and account numbers. 周一&#xff0c;攻击者可能泄露了T-Mobile 7700万客户中的3&#xff05;&…

第二篇 第三章防火防烟分区检查(一)

仓库面积可以增加3倍 就是乘以4 要一定条件 : 第二篇 第三章防火防烟分区检查&#xff08;一&#xff09; 21分钟处 该题比较有代表性 停车库 耐火等级允许最大面积 民用建筑防火分区 防烟分区的划分    防火卷帘控制器的测试 防火阀 装在通风,空调系统中 只有连在风机主管…

如何在Xbox One或PlayStation 4上为Skyrim特别版安装Mods

The Elder Scrolls V: Skyrim Special Edition is now available on PlayStation 4 and Xbox One, and for the first time, “mods” are available to console gamers. Elder Scrolls V&#xff1a;Skyrim特别版现已在PlayStation 4和Xbox One上可用&#xff0c;并且首次向主…

微软宣布:PowerBI 已经与 Office 整合,一切更简单,变革又来了

很多人认为 Office 是 Office&#xff0c;PowerBI 是 PowerBI&#xff0c;怎么在 PPT 中显示 PowerBI 呢&#xff1f;这种问题以后将再不会存在。微软已经宣布&#xff0c;PowerBI 已经与 Office 深度整合&#xff0c;在未来的企业中&#xff0c;PowerBI 将与 Word&#xff0c;…

066:ORM查询条件详解-startswith和endswith:

ORM查询条件详解-startswith和endswith&#xff1a; startswith&#xff1a;判断某个字段的值是否是以某个值开始的。大小写敏感。示例代码如下&#xff1a; articles1 Article.objects.filter(title__startswith"fuck") 以上代码的意思是提取所有标题以 fuck 字符串…

前端工程师面试题汇总

HTML Doctype作用&#xff1f;严格模式与混杂模式如何区分&#xff1f;它们有何意义? HTML5 为什么只需要写 <!DOCTYPE HTML>&#xff1f; 行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; 页面导入样式时&#xff0c;使用lin…

火狐和chrome_Firefox,Chrome和Edge都将支持WebAuthn的硬件两因素身份验证

火狐和chromeLogging into Gmail or Facebook could soon mean plugging in a USB device, potentially making phishing a thing of the past. 登录Gmail或Facebook可能很快就意味着要插入USB设备&#xff0c;这可能使网络钓鱼成为过去。 That’s thanks to WebAuthn, a new o…

Could not delete .........May be locked by another process.

问题 原因&#xff1a;默认的设置是文件修改后立即发布&#xff0c;这样的设置是在你每个保存文件时都会触发&#xff0c;如果tomcat已经在运行&#xff0c;这样频繁的操作也会造成文件锁死 解决&#xff1a; Tomcat 右键clean 转载于:https://www.cnblogs.com/feiZhou/p/93…

如何将您的Google Authenticator凭证移至新的Android手机或平板电脑

Most of the app data on your Android is probably synced online will automatically sync to a new phone or tablet. However, your Google Authenticator credentials won’t — they aren’t synchronized for obvious security reasons. Android上的大多数应用程序数据可…

关于经纬度的两个计算[Teaksxgluxv]

一、子午线周长(公里) 40008.548 赤道周长(公里) 40075.704 纬度40008.548 / 360(度) 111.135 公里/度40008.548 / (360*60)(分) 1.85 公里/分40008.548 / (360*60*60)(秒) 30.87 米/秒 经度首先算相应经度位置的纬度圈长度40075.704 * cos(经度)然后方法相同&#xff0c;除…

转载通过 Docker 实现传统应用程序的现代化

长期以来&#xff0c;IT 组织将其预算的 80% 用于简单地维护现有应用程序&#xff0c;而只花费 20% 用于创新。 在过去的 10 年里&#xff0c;这一比例并没有太大改观。而同时又必须面对创新的压力。无论是直接来自客户的需求&#xff0c;要求提供新的功能&#xff0c;还是来自…

Blazor学习之旅 (6) 路由系统

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。许久没有更新Blazor学习系列了&#xff0c;今天续更。Blazor 的路由系统就和 ASP.NET MVC的路由系统一样&#xff0c;可以为我们提供灵活的选项&#xff0c;可用于确保用户请求到达可处理它们并返回用户想要的信息的…

kindle降级卡大树_从提示框:Kindle购物流程图,iOS降级和DIY焊接笔

kindle降级卡大树Once a week we round up some of the tips from the HTG tips box and share them with the greater readership; this week we’re looking at shopping for Kindles with a flowchart, downgrading iOS, and rolling your own DIY soldering pen. 每周一次&…