美麗區間

題目鏈接

戳這

Solution

因爲n很小所以可以 n方枚舉左右端點,然後實際上就是判斷前面一半將69交換後是否是個 迴文且這個 迴文不存在反轉後沒意義的數,對於那幾個翻轉後沒意義的數字隨便用字母代替即可,對於前綴和後綴分別哈希然後判斷是否相等即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7,base=233;
string s;
string s1;
int sum[1000010];
int sum1[1000010];
int js[1001];
int bj[1000010];
int jc[1000010];
int check1(int x,int now){
	return (sum[x+now]-sum[now]*jc[x]%mod+mod)%mod;
}
int check2(int x,int now){
	return (sum1[now-x+1]-sum1[now+1]*jc[x]%mod+mod)%mod;
}
signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s,s1+=s;
		js[i]=js[i-1]+s.size();
	}
    jc[0]=1;
	for(int i=1;i<=s1.size();i++)
		jc[i]=jc[i-1]*base%mod;
	for(int i=1;i<=s1.size();i++){
		if(s1[i-1]=='6') sum[i]=(sum[i-1]*base%mod+9)%mod;
		else if(s1[i-1]=='9') sum[i]=(sum[i-1]*base%mod+6)%mod;
		else if(s1[i-1]=='1'||s1[i-1]=='8'||s1[i-1]=='0') sum[i]=(sum[i-1]*base%mod+s1[i-1]-'0')%mod;
		else sum[i]=(sum[i-1]*base%mod+10)%mod;
	}
	for(int i=s1.size();i>=1;i--) sum1[i]=(sum1[i+1]*base%mod+s1[i-1]-'0')%mod;
	int maxx=0;
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++){
			int ans=js[j]-js[i-1];
			ans=(ans+1)/2;
			if(check1(ans,js[i-1])==check2(ans,js[j])) 
				maxx=max(j-i+1,maxx);
		}
	cout<<maxx;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章