UVA257 Palinwords题解
题目:传送门
思路:
哈希+排序,先分类讨论长度为 \(3\) 和 \(4\) 的回文字符串,求出其哈希值,再对哈希值排序,最后循环依次比较哈希值是否不同即可。(求哈希值时需处理两个回文串是否包含)(详见代码)
代码:
#include <bits/stdc++.h>
using namespace std;
const int w=131;
int l,u[300],v,s,i;
string a;
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
while (cin>>a)
{
l=a.length();
v=0;
for (i=0;i<l-2;i++)//求出长度为 3 的回文字符串的哈希值
{
if (a[i]==a[i+2]) u[++v]=a[i]*w*w+a[i+1]*w+a[i+2];
}
for (i=0;i<l-3;i++)//求出长度为 4 的回文字符串的哈希值,并处理回文字符串包含
{
if (a[i]==a[i+3] && a[i+1]==a[i+2]) u[++v]=a[i]*w*w+a[i+1]*w+a[i+2];
}
sort(u+1,u+v+1);//对哈希值进行排序
for (i=1;i<v;i++)
{
if (u[i]!=u[i+1])//依次比较哈希值是否不同,如果有不同的就输出
{
cout<<a<<endl;
break;
}
}
}
return 0;
}