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;
}
posted @ 2022-04-04 21:52  Jason142  阅读(17)  评论(0编辑  收藏  举报