Advertisement

上海计算机学会2024年3月月赛C++乙组T3精确匹配

阅读量:

精确匹配

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定一个字符串称之为模式 p,再给定一个字符串称之为文本 t。请计算 p 是否可以成为 t 的子串,输出 t 有多少种不同位置的子串恰好等于 p。

输入格式
  • 第一行:单个字符串表示 p
  • 第二行:单个字符串表示 t
  • 保证 p 与 t 仅由小写字母构成。
输出格式
  • 单个整数:表示答案
数据范围
  • 30% 的数据,1≤∣t∣≤100
  • 60% 的数据,1≤∣t∣≤10000
  • 1000% 的数据,1≤∣p∣≤∣t∣≤300,000
样例数据

输入:
5
10 20 30 40 50
输出:
90

解析:KMP算法,详见代码:

复制代码
 #include<iostream>

    
 #include<string>
    
 using namespace std;
    
 int n, m;
    
 int ne[300010];
    
 string p, t;
    
 int ans = 0;
    
 //这个函数对字符串s进行预处理得到next数组
    
 void get_Next(string s, int ne[]) {
    
     int j = 0;
    
     ne[0] = 0;	//初始化
    
     //i指针指向的是后缀末尾,j指针指向的是前缀末尾
    
     for (int i = 1; i < s.size(); i++) {
    
     //前后缀不相同,去找j前一位的最长相等前后缀
    
     while (j > 0 && s[i] != s[j])	j = ne[j - 1];
    
     if (s[i] == s[j])	j++;	//前后缀相同,j指针后移
    
     ne[i] = j;	//更新next数组
    
     }
    
 }
    
  
    
 int main() {
    
     cin >> p >> t;
    
     m = t.length();
    
     n = p.length();
    
     get_Next(p, ne);
    
     for (int i = 0, j = 0; i < m; i++) {
    
     while (j > 0 && t[i] != p[j])	j = ne[j - 1];
    
     if (t[i] == p[j])	j++;
    
     if (j == n) {
    
         ans++;
    
         j = ne[j - 1];
    
     }
    
     }
    
     cout << ans;
    
     return 0;
    
 }
    
    
    
    
    AI写代码cpp
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/beXCfBOQ92DJjRWIEaoHNrFP7A0Z.png)

全部评论 (0)

还没有任何评论哟~