求助题目QwQ
  • 板块灌水区
  • 楼主X_tiger
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/6 13:24
  • 上次更新2024/11/6 17:58:00
查看原帖
求助题目QwQ
1052491
X_tiger楼主2024/11/6 13:24

题目

#include<bits/stdc++.h>
#define int long long
#define N 1000004
#define inf 0xffffff
#define p1 151
#define p2 131
#define mod1 100005
#define mod2 1000006

using namespace std;
int front_hash1[N],front_hash2[N],back_hash1[N],back_hash2[N];

int pow1[N],pow2[N];

bool check1 ( int m , int len ){
	int f_h1,b_h1;
	f_h1 = (front_hash1[m + len] - front_hash1[m - len - 1] * pow1[m + len - m + len + 1] % mod1 + mod1 ) % mod1;
	b_h1 = (back_hash1[m - len - 1] - back_hash1[m + len] * pow1[m + len - m + len + 1] % mod1 + mod1 ) % mod1;
	
	if ( f_h1 == b_h1 ){
		return true;
	}
	return false;
}
bool check2( int m , int len ){
	int f_h2,b_h2;
	f_h2 = (front_hash2[m + len] - front_hash2[m - len - 1] * pow2[m + len - m + len + 1] % mod2 + mod2 ) % mod2;
	b_h2 = (back_hash2[m - len - 1] - back_hash2[m + len] * pow2[m + len - m + len + 1] % mod2 + mod2 ) % mod2;
	if ( f_h2 == b_h2 ){
		return true;
	}
	return false;
}
signed main(){
	string x;
	int cnt = 1;
	while (1){
		int ans = -inf;
		cin >> x;
		if ( x == "END" ){
			return 0;
		}
		int len = x.size();
		for ( int i = 0; i < len; i ++ ){
			if ( i == 0 ){
				front_hash1[i] = x[i] % mod1;
				front_hash2[i] = x[i] % mod2;
			}
			else{
				front_hash1[i] = (front_hash1[i - 1] * p1 + x[i] ) % mod1;
				front_hash2[i] = (front_hash2[i - 1] * p2 + x[i] ) % mod2;
			}
		}
		for ( int i = 0; i < len; i ++ ){
			back_hash1[i] = (back_hash1[i + 1] * p1 + x[i] ) % mod1;
			back_hash2[i] = (back_hash2[i + 1] * p2 + x[i] ) % mod2;
		}
		
		for ( int j = 1; j <= len - 1; j ++ ){
			int l = 1,r = ( len / 2 + 1 );
			while ( l <= r ){
				int mid = (l + r) >> 1;
				if ( check1(j,mid) || check2(j,mid) )	l = mid + 1;//
				else									r = mid - 1;
			}
			ans = max ( ans , r );
		}
		cout << "Case " << cnt << ": " << ans << "\n";
		cnt ++;
	}
	
	return 0;
}
2024/11/6 13:24
加载中...