第一行一个字符串S。
第二行一个字符串T。两个字符串保证均只含小写字母。(1≤|S|≤500000, 1≤|T|≤100)
输出仅包含|S|个正整数,分别表示[1,r]内有多少个T字符串。(1<=r<=|S|)
ababac ab
0 1 1 2 2 2
#include <bits/stdc++.h> using namespace std; #define ll long long int #define angel 0x3f3f3f3f #define maxn 500005 #define pb push_back const ll mod=1000000007; char str[maxn]; char p[105]; int NEXT[105]; vector<int>vec; void GetNEXT() { int pLen = strlen(p); NEXT[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++k; ++j; NEXT[j] = k; } else { k = NEXT[k]; } } } void Find() { int slen=strlen(str); int plen=strlen(p); int m=0,n=0; while(m<slen) { if(str[m]==p[n]||n==-1) { m++; n++; if(n==plen) { vec.pb(m-1); n=0; m=m-plen+1; } } else n=NEXT[n]; } } int main() { scanf("%s",str); scanf("%s",p); GetNEXT(); Find(); int size=vec.size(); int len=strlen(str); int now=0; int cnt=0; for(int i=0;i<len;i++) { if(now<len&&i==vec[now]) { now++; cnt++; } if(i!=0) printf(" "); printf("%d",cnt); } return 0; } /* 5 54 125 2 52 128 */
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String S = br.readLine(); String T = br.readLine(); int slen = S.length(); int tlen = T.length(); int count = 0; for(int r = 1; r <= slen; r++){ if(r < tlen) System.out.print(count + " "); else{ if(S.substring(r - tlen, r).equals(T)) count ++; System.out.print(count + " "); } } } }
import java.util.*; import java.io.*; public class Main { private static int[] getNext(char[] cs){ int len = cs.length, j = -1; int[] next = new int[len]; next[0] = -1; for(int i = 1; i < len; ++i){ while(j != -1 && cs[i] != cs[j + 1]){j = next[j];} if(cs[i] == cs[j + 1]){++j;} next[i] = j; } return next; } public static void main(String[] args){ Scanner scan = new Scanner(System.in); String S = scan.nextLine(), T = scan.nextLine(); char[] charS = S.toCharArray(), charT = T.toCharArray(); int m = S.length(), n = T.length(); int[] next = getNext(charT); int count = 0; int j = -1; for(int i = 0; i < m; ++i){ while(j != -1 && charS[i] != charT[j + 1]){j = next[j];} if(charS[i] == charT[j + 1]){++j;} if(j == n - 1){ ++count; j = next[j]; } System.out.print(count + " "); } } }
import sys def countsubstr(s, t): pre = 0 ans = [] for i in range(len(s)): if i >= len(t) - 1: if s[i-len(t)+1:i+1] == t: pre += 1 ans.append(pre) return ans if __name__ == '__main__': lines = sys.stdin.readlines() if len(lines) == 1: s = lines[0].strip() t = '' else: s = lines[0].strip() t = lines[1].strip() if len(t) > len(s): for i in range(len(s)): print(0, end=' ') elif not t&nbs***bsp;len(t) == 0: for i in range(len(s)): print(0, end=' ') else: ans = countsubstr(s, t) for i in range(len(s)): print(ans[i], end=' ')一开始没懂题目意思,实际上,s中包含的t串可以有重叠