题目大意:
给你n个字符串,让你把包含两个回文子串的字符串挑出来,(两个回文子串不能互相包含,也不能够相同)。
解决方法:
字符串hash,(不要写挫了)
我的代码:
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#define ull unsigned long long
#define seed 131
using namespace std;
char s[1000],n;
vector <ull> pos;
int lens[1000];
ull base[1000];
int hxx(int x,int y,ull a,int len){
ull b=0;
for (int i=x;i<x+len;i++)
b=b*seed+s[i];
//cout<<x<<" "<<y<<endl;
if (b==a) return 0;
for (int i=x;i+len<y;i++){
b=b*seed+s[i+len]-s[i]*base[len];
if (a==b) return 0;
}
return 1;
}
int kkk(int x,int y,ull k){
for (int i=0;i<pos.size();i++){
if (hxx(x,y,pos[i],lens[i])) return 1;
}
pos.push_back(k);
lens[pos.size()-1]=y-x;
return 0;
}
int yes(int len){
//cout<<len<<endl;
ull a=0,b=0;
for (int i=0;i<len;i++){
a=a*seed+s[i];
b=b+s[i]*base[i];
}
//if (a==b) cout<<a<<" "<<b<<endl;
if (a==b) {
if (kkk(0,len,a)) return 1;
}
for (int i=0;i+len<n;i++){
a=a*seed+s[i+len]-s[i]*base[len];
b=(b+s[i+len]*base[len]-s[i])/seed;
//if (a==b) cout<<a<<" "<<b<<endl;
if (a==b){
if (kkk(i+1,i+len+1,a)) return 1;
}
}
return 0;
}
int ok(char *s){
pos.clear();
n=strlen(s);
for (int i=3;i<n;i++){
if (yes(i)) return 1;
}
return 0;
}
int main (){
//freopen("test.in","r",stdin);
base[0]=1;
for (int i=1;i<1000;i++) base[i]=base[i-1]*seed;
while (~scanf("%s",s)){
//cout<<s<<endl;
if (ok(s)) printf("%s\n",s);
}
return 0;
}