G 牛牛和字符串的日常

G	牛牛和字符串的日常

 

 思路:KMP裸题

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6+7;
 4 char p[N],s[N];//p是模式串(短),s是文本串(长) 
 5 int ne[N];//next[j]就是待匹配串从t[0]开始到t[j-1]结尾的这个子串中,前缀和后缀相等时对应前缀/后缀的最大长度
 6 int main()
 7 {
 8     cin >>s+1;
 9     int t;cin >>t;    
10     int ans=0; 
11     int n=strlen(s+1);
12     for(int i=2,j=0;i<=n;i++)//先求模式串本身的next数组 
13     {
14         while(j&&s[i]!=s[j+1]) j=ne[j];
15         if(s[i]==s[j+1]) j++;
16         ne[i]=j;
17     }
18     //for(int i=1;i<=n;i++) cout <<ne[i];
19     while(t--){
20         cin >>p+1;
21         int m=strlen(p+1); 
22         int cnt=0;
23         for(int i=1,j=0;i<=m;i++){
24             while(j&&p[i]!=s[j+1]) j=ne[j];
25             if(p[i]==s[j+1]) j++; 
26             cnt=max(cnt,j);
27             if(j==n) j=ne[j]; 
28         }
29         ans+=cnt;
30     }
31     cout <<ans<<endl;
32 }

 

上一篇:我的第21个代码


下一篇:2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一个数字字符串比