玄关求条
查看原帖
玄关求条
818730
yingshi1119楼主2024/10/22 10:58

rt 双哈希只过了n<=10

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+9;
const int mod2=1e9+7;
map<pair<int,int> ,int> m; 
int main()
{
	int n;
	cin>>n;
	string s;
	cin>>s;
	long long ans=0,ans2=0;
	m[make_pair(ans,ans2)]++;
	ans*=26;
	ans+=s[0]-'a'+1;
	ans2*=26;
	ans2+=s[0]-'a'+1;
	m[make_pair(ans,ans2)]++;
	stack<char> st; 
	st.push(s[0]);
	for(int i=1;i<s.size();i++)
	{
		if(st.size()!=0)
		{
			if(st.top()==s[i])
			{
				ans-=st.top()-'a'+1;
				ans=(ans+mod)%mod;
				ans/=26;
				ans2-=st.top()-'a'+1;
				ans2=(ans2+mod2)%mod2;
				ans2/=26;
				st.pop();
			}
			else
			{
				ans*=26;
				ans+=s[i]-'a'+1;
				ans2*=26;
				ans2+=s[i]-'a'+1;
				st.push(s[i]);
			}
		}
		else
		{
			ans*=26;
			ans+=s[i]-'a'+1;
			ans2*=26;
			ans2+=s[i]-'a'+1;
			st.push(s[i]);
		}
		ans%=mod;
		ans2%=mod2;
	//	cout<<ans<<endl;
		m[make_pair(ans,ans2)]++;
	}
	map<pair<int,int>,int>::iterator it;
	long long cnt=0;
	for(it=m.begin();it!=m.end();it++)
	{
		long long x=it->second;
		cnt+=(x-1)*x/2;
	} 
	cout<<cnt;
	return 0;
}
2024/10/22 10:58
加载中...