序列自动机(模板)

题目:Summer Trip

#include<bits/stdc++.h>
using namespace std;
#define ll long long
string s;
vector<int>ve[30];  //v[i][j]表示记录序列中第j个i字母的位置
ll fun(int a,int b){
	ll res=0;
	int lena=ve[a].size();
	int lenb=ve[b].size();
	int j=0;
	for(int i=0;i<lena;i++){
		while(j<lenb && ve[b][j]<ve[a][i] ) j++;  //这里的判断条件不能反过来,否则会访问非法内存
		if(j==lenb) break;
		if(ve[a][i+1]>ve[b][j] || i+1==lena) res++;
	}
	return res;	
}
int main(){
	cin >> s;
	int len=s.size();
	for(int i=0;i<len;++i){
		ve[ s[i]-'a' ].push_back(i);
	}
	ll ans=0;
	for(int i=0;i<26;++i){
		for(int j=0;j<26;++j){
			if(i==j) continue;
			ans+=fun(i,j);
		}
	}
	cout << ans ;
	return 0;
} 
全部评论

相关推荐

11-03 13:18
门头沟学院 Java
包行:平时怎么刷算法题的哇,字节的手撕听说都很难
字节跳动工作体验
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务