链接:http://vjudge.net/problem/viewProblem.action?id=47586
题意:给一个字符串,可以将从前数第i~j和从后数第i~j字符串看作一个字符,问整段字符串看作一个回文里有多少个字符。
思路:字符串哈希,从前开始哈希也从后开始哈希,遇到哈希值相同就多两个字符,最后处理一下中间的字符即可。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <cstdlib> #include <queue> #include <stack> #include <vector> #include <ctype.h> #include <algorithm> #include <string> #include <set> #include <ctime> #define PI acos(-1.0) #define maxn 10005 #define INF 0x7fffffff #define eps 1e-8 #define seed 31 typedef long long LL; typedef unsigned long long ULL; using namespace std; ULL aa[50005]; void init() { aa[0]=1; for(int i=1;i<=50000;i++) aa[i]=aa[i-1]*seed; } int main() { int T; char ss[50005]; scanf("%d",&T); init(); for(int ii=1;ii<=T;ii++) { ULL head=0,tail=0; scanf("%s",ss); printf("Case #%d: ",ii); //cout<<endl; int l=strlen(ss); int k=l/2; int from=0; int ans=0; for(int i=0;i<k;i++) { //cout<<i<<" "<<l-i-1<<endl; //cout<<head<<" "<<tail<<endl; head*=seed; head+=(ss[i]-'A'+1); tail+=(ss[l-i-1]-'A'+1)*aa[i-from]; //cout<<i<<" "<<from<<endl; //cout<<head<<" "<<tail<<endl; if(head==tail) { ans+=2; from=i+1; head=0; tail=0; } } if(head!=0) ans++; if(l%2==1&&head==0) ans++; printf("%d\n",ans); } return 0; }
UvaLive 6439 Pasti Pas! 字符串哈希,布布扣,bubuko.com
时间: 2024-12-29 11:18:33