2 条题解

  • 0
    @ 2025-10-8 16:55:58
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1110000;
    char s[2*N],a[N];
    int d[2*N],n;
    void get_d()
    {
    	n=strlen(a+1);
    	s[0]='$';s[2*n+1]='#';
    	for(int i=1;i<=n;i++)s[2*i-1]='#' ,s[2*i]=a[i];
    	n=2*n+1;
    	memset(d,0,sizeof(d));d[1]=1;
    	for(int i=2,L=1,R=1;i<=n;i++)
    	{
    		if(i<=R) d[i]=min(d[R-i+L],R-i+1);
    		while( s[i-d[i]]==s[i+d[i]] ) d[i]++;
    		if(i+d[i]-1>R) L=i-d[i]+1,R=i+d[i]-1;
    	}
    }
    int main()
    {
    	int t=0;
        while(scanf("%s",a+1)!=EOF)
        {
        	if( strcmp(a+1,"END")==0) break;
        	get_d();
        	int ans=0;
        	for(int i=1;i<=n;i++) ans=max(d[i]-1,ans);
        	printf("Case %d: %d\n",++t,ans);
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:55:52
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1110000;
      char s[2*N],a[N];
      int d[2*N],n;
      void get_d()
      {
      	n=strlen(a+1);
      	s[0]='$';s[2*n+1]='#';
      	for(int i=1;i<=n;i++)s[2*i-1]='#',s[2*i]=a[i];
      	n=2*n+1;
      	memset(d,0,sizeof(d));d[1]=1;
      	for(int i=2,L=1,R=1;i<=n;i++)
      	{
      		if(i<=R) d[i]=min(d[R-i+L],R-i+1);
      		while( s[i-d[i]]==s[i+d[i]] ) d[i]++;
      		if(i+d[i]-1>R) L=i-d[i]+1,R=i+d[i]-1;
      	}
      }
      int main()
      {
      	int t=0;
          while(scanf("%s",a+1)!=EOF)
          {
          	if( strcmp(a+1,"END")==0) break;
          	get_d();
          	int ans=0;
          	for(int i=1;i<=n;i++) ans=max(d[i]-1,ans);
          	printf("Case %d: %d\n",++t,ans);
          }
          return 0;
      }
      • 1

      *【Manacher马拉车算法】回文子串的最大长度[POJ3974]

      信息

      ID
      1278
      时间
      1000ms
      内存
      64MiB
      难度
      3
      标签
      递交数
      57
      已通过
      30
      上传者