C++课后习题训练记录Day137
1.练习项目 题目描述:小 Z 同学每天都喜欢斤斤计较今天他又跟字符串杠起来了。他看到了两个字符串 S1 S2 他想知道 S1 在 S2 中出现了多少次。现在给出两个串 S1S2(只有大写字母)求 S1 在 S2 中出现了多少次。输入描述共输入两行第一行为 S1第二行为 S2。1len(s1)len(s2)106字符只为大写字母或小写字母。输出描述输出一个整数表示 S1 在 S2 中出现了多少次。2.选择课程在蓝桥云课中选择题库选择题号2047并开始练习。3.开始练习1KMP算法 #includebits/stdc.husing namespace std;const int N 1e610;char s[N],p[N];int nex[N];int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cinp1;int mstrlen(p1);cins1;int nstrlen(s1);//get nextnex[0]nex[1]0;for(int i2,j0;im;i){while(jp[i]!p[j1])jnex[j];if(p[i]p[j1])j;nex[i]j;}int ans0;for(int i1,j0;in;i){while(js[i]!p[j1])jnex[j];if(s[i]p[j1])j;if(jm)ans;}coutans\n;return 0;}2字符串哈希#includebits/stdc.husing namespace std;const int N 1e610;char s[N],p[N];typedef unsigned long long ull;const ull base 131;ull h1[N],h2[N],b[N];ull getHash(ull h[],int l,int r){return h[r]-h[l-1]*b[r-l1];}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cinp1;int mstrlen(p1);cins1;int nstrlen(s1);b[0]1;for(int i1;in;i){b[i]b[i-1]*base;h1[i]h1[i-1]*base(int)p[i];h2[i]h2[i-1]*base(int)s[i];}int ans0;for(int i1;im-1n;i){if(getHash(h1,1,m)getHash(h2,i,im-1))ans;}coutans\n;return 0;}3检验结果对此代码进行检验检验后无报错提交此代码判题结果为正确100分。4练习心得注意每段代码末尾的分号是否存在 如不存在则需即使补充输入法 是否切换为英语模式语法是否错误。