2 条题解

  • 0
    @ 2025-10-8 16:52:24
    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long LL;
    const int N= 1e6 + 10;
    char sa[N], sb[N];
    int lena, lenb;
    LL p[N], z[N];
    
    void get_z() {
    	memset(z, 0, sizeof(z));
    	z[1] = lenb;
    	
    	for (int i = 2, l = 0, r = 0; i <= lenb; i ++) {
    		if (i <= r) {
    			z[i] = min(z[i - l + 1], 1LL * (r - i + 1));
    		}
    		while (1 + z[i] <= lenb && i + z[i] <= lenb && sb[1 + z[i]] == sb[i + z[i]]) {
    			z[i] ++;
    		}
    		if (i + z[i] - 1 > r) {
    			l = i;
    			r = i + z[i] - 1; 
    		}
    	}
    }
    
    void get_p() {
    	memset(p, 0, sizeof(p));
    	
    	for (int i = 1, l = 0, r = 0; i <= lena; i ++) {
    		if (i <= r) {
    			p[i] = min(z[i - l + 1], 1LL * (r - i + 1));
    		}
    		while (i + p[i] <= lena && 1 + p[i] <= lenb && sa[i + p[i]] == sb[1 + p[i]]) {
    			p[i] ++;
    		}
    		if (i + p[i] - 1 > r) {
    			l = i;
    			r = i + p[i] - 1;
    		}
    	}
    }
    
    int main () {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	
    	cin >> sa + 1 >> sb + 1;
    	lena = strlen(sa + 1);
    	lenb = strlen(sb + 1);
    	
    	get_z();
    	get_p();
    	
    	for (int i = 1; i <= lena; i ++) {
    		cout << p[i] << " ";
    	}
    	cout << "\n";
    	
    	return 0;
    }
    
    • 0
      @ 2025-10-8 16:52:13

      #include<bits/stdc++.h>
      using namespace std;
      

      typedef long long LL; const int N= 1e6 + 10; char sa[N], sb[N]; int lena, lenb; LL p[N], z[N];

      void get_z() { memset(z, 0, sizeof(z)); z[1] = lenb;

      for (int i = 2, l = 0, r = 0; i &lt;= lenb; i ++) {
      	if (i &lt;= r) {
      		z[i] = min(z[i - l + 1], 1ll * (r - i + 1));
      	}
      	while (1 + z[i] &lt;= lenb &amp;&amp; i + z[i] &lt;= lenb &amp;&amp; sb[1 + z[i]] == sb[i + z[i]]) {
      		z[i] ++;
      	}
      	if (i + z[i] - 1 &gt; r) {
      		l = i;
      		r = i + z[i] - 1; 
      	}
      }
      

      }

      void get_p() { memset(p, 0, sizeof(p));

      for (int i = 1, l = 0, r = 0; i &lt;= lena; i ++) {
      	if (i &lt;= r) {
      		p[i] = min(z[i - l + 1], 1ll * (r - i + 1));
      	}
      	while (i + p[i] &lt;= lena &amp;&amp; 1 + p[i] &lt;= lenb &amp;&amp; sa[i + p[i]] == sb[1 + p[i]]) {
      		p[i] ++;
      	}
      	if (i + p[i] - 1 &gt; r) {
      		l = i;
      		r = i + p[i] - 1;
      	}
      }
      

      }

      int main () { ios::sync_with_stdio(False); cin.tie(0);

      cin &gt;&gt; sa + 1 &gt;&gt; sb + 1;
      lena = strlen(sa + 1);
      lenb = strlen(sb + 1);
      
      get_z();
      get_p();
      
      for (int i = 1; i &lt;= lena; i ++) {
      	cout &lt;&lt; p[i] &lt;&lt; " ";
      }
      cout &lt;&lt; "\n";
      
      return 0;
      

      }

       

      </p>
      • 1

      信息

      ID
      577
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      49
      已通过
      21
      上传者