首页 > 其他分享 >「ABC353」Yet Another Sigma Problem

「ABC353」Yet Another Sigma Problem

时间:2024-05-15 19:30:49浏览次数:28  
标签:int mi mid ABC353 while && ans Problem Sigma

题目

字典树做法(用时187ms)

#include<cstdio>
#include<ctype.h>
const int N = 3e5 + 10;
int n;
long long ans;
int trans[N][26],cnt[N]; 
int tot;
char s[N];
template<class T>
void read(T &x){
	char c = getchar();
	while(!isdigit(c))c = getchar();
	while(isdigit(c))x = (x<<3)+(x<<1)+(c^48),c = getchar();
}
void insert(){
	int now = 0;
	char c = getchar();
	while(!isalpha(c))c = getchar();
	while(isalpha(c)){
		if(!trans[now][c-'a'])trans[now][c-'a'] = ++tot;
		now = trans[now][c-'a'];
		ans += cnt[now];
		++cnt[now];
		c = getchar();
	}
}
signed main(){
	read(n);
	for(int i = 1;i<=n;++i)insert();
	short st[50],top = 0;
	do{
		st[++top] = ans%10,ans /= 10;
	}while(ans);
	while(top)putchar(48 | st[top--]);
	return 0;
}

搜索(用时262ms)

#include<iostream>
#include<algorithm>
#define main Main();signed main(){ios::sync_with_stdio(0);cin.tie(0);return Main();}signed Main
using namespace std;
const int N = 3e5 + 10;
int n;
long long ans;
string s[N];
void dfs(int l,int r,int d){
	if(l >= r)return ;
	if(d)ans += (r - l + 1) * (r - l) >> 1;
	int pre = l;
	for(int i = l;i<=r;++i){
		if(s[i].size() == d){ pre = i+1; continue; }
		if(s[i][d] != s[pre][d])dfs(pre,i-1,d+1),pre = i;
	}
	dfs(pre,r,d+1);
}
signed main(){
	cin >> n; for(int i = 1;i<=n;++i)cin >> s[i];
	sort(s+1,s+n+1);
	dfs(1,n,0);
	cout << ans;
	return 0;
}

分治(注意等于与否的判断)(用时263ms)

#include <iostream>
#include<cstdio>
#include<algorithm>
#define main Main(); signed main(){ return ios::sync_with_stdio(0), cin.tie(0), Main(); } signed Main
using namespace std;
string s[300010];
int n;
long long ans;
inline int lcp(const string &a,const string &b){
	int now = min(a.size(),b.size());
	for(int i = 0;i<now;++i)if(a[i] != b[i])return i;
	return now;
}
int h[300010];

void solve(int l,int r){
	if(l == r)return ;
	int mid = (l + r)>>1;
	solve(l,mid),solve(mid+1,r);
	int i = mid, j = mid+1, mi = min(h[i],h[j]);
	while(i > l && h[i-1] >= mi)--i;
	while(j < r && h[j+1] >= mi)++j;
	ans += 1ll * (mid - i + 1) * (j - mid) * mi;
	while(i > l || j < r){
		if(j == r || (i > l && h[i-1] >= h[j+1])){
			int t = i;
			mi = h[--i];
			while(i > l && h[i-1] >= mi)--i;
			while(j < r && h[j+1] > mi)++j;
			ans += 1ll * (t-i) * (j - mid) * mi;
		}else{
			int t = j;
			mi = h[++j];
			while(i > l && h[i-1] > mi)--i;
			while(j < r && h[j+1] >= mi)++j;
			ans += 1ll * (mid - i + 1) * (j-t) * mi;
		}
	}
}
signed main(){
	cin >> n;
	for(int i = 1;i<=n;++i)cin >> s[i];
	sort(s+1,s+n+1);
	for(int i = 1;i<n;++i)h[i] = lcp(s[i],s[i+1]),ans += h[i];
	solve(1,n-1);
	cout << ans << endl;
	return 0;
}

标签:int,mi,mid,ABC353,while,&&,ans,Problem,Sigma
From: https://www.cnblogs.com/fight-for-humanity/p/18194555

相关文章

  • abc353f 题解
    大分讨,由于没注意到细节挂大分。下面称大小为\(n\timesn\)的为大格子,\(1\times1\)的为小格子。把\(n\timesn\)个小格子组成的正方形称为一个部分。分析我们先来讨论一般情况。思考一对于\(n\ge3\)的一般情况,如果要求任意两个大格子到对方的距离最小,怎么做?根据贪......
  • ABC353 | 如同流星划过天空
    ABC353|如同流星划过天空A.&B.依题意模拟即可。C.注意只有\(f(x,y)\)需要对\(10^8\)取模,\(f\)的求和不需要。关注到\(a_i\in[1,10^8)\),故\(a_i+a_j\in[2,2\times10^8)\)。从而\(f(x,y)=[x+y<10^8](x+y)+[x+y\ge10^8](x+y-10^8)=x+y-10^8[x+y\ge10^......
  • ABC353C Sigma Problem 题解
    ABC353CSigmaProblem题解题目链接:AT题目中的两个求和符号\(\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\)实际上是在枚举所有的有序数对\((i,j)\)。而有序数对的个数\(N(N-1)/2=O(N^{2})\),真的去枚举所有数对肯定会T。这时应该考虑去拆贡献,求出每个\(A_i\)对答案的贡献。......
  • C - Sigma Problem
    C-SigmaProblemhttps://atcoder.jp/contests/abc353/tasks/abc353_c 思路暴力TLE观察a1a2...an序列计算目标是,两两结合并并求模sum=sigma(ai+aj)%1e8ai,aj<=1e8ai+aj可能溢出,也可能不溢出于是我们考虑,统计所有溢出的个数。 对数组进行排序,......
  • ABC353E字典树处理最长公共前缀
    https://atcoder.jp/contests/abc353/tasks/abc353_e其实就是字典树板子题。似乎遇到最长公共前缀,就该想到字典树。依次加入每个字符串:维护一个数组siz来统计在当前串之前的串在对应点的出现次数。手模一下字典树的建树过程,显然如果当前串\(S_i\)能跑到一个曾经串\(S_......
  • ABC353
    不知道为啥有断更了一周...Ewoc,怎么跟我出的题目这么像先把字符串扔到一个Trie里面,然后对于每一个点我们考虑这一个点到根节点组成的字符串能是多少对字符串的最长公共前缀。我们定义\(cnt_u\)表示共有多少个字符串的结尾在以\(u\)为根的子树内。对于\(u\)节点,其贡献......
  • Week 9 Problems
    T1用等值演算、构造指派等方式判断公式的永真性(1)\[(\forallxP(x)\rightarrow\existxQ(x))\rightarrow\existx(P(x)\rightarrowQ(x))\](2)\[(\forallxP(x)\rightarrow\forallxQ(x))\rightarrow\forallx(P(x)\rightarrowQ(x))\]T2以下哪一步出现错误?......
  • Codeforces 954I Yet Another String Matching Problem
    考虑到这个答案怎么算。能发现相当于是对应的字符间相连边,那么一个连通块中的字符就要变成同一个字符。于是一个连通块的代价就是\(sz-1\)。所以令有\(x\)个连通块,最后的代价就是\(|\Sigma|-x\)。考虑到因为\(|\Sigma|=6\),而\(B_6=203\)(贝尔数,\(B_n\)意义为大......
  • 「主席树维护高精度」 CF464E The Classic Problem
    发现难点在于维护\(dis_u\)(起点\(s\)到\(u\)的最短路)。如果使用暴力高精度,复杂度会乘上一个\(len\)。考虑边权\(2^w\)的特殊性质,如果使用一个二进制串来维护\(dis\),那么加上边权\(2^w\)相当于将二进制下某一段\(1\)置为\(0\),然后再将一个\(0\)置为\(1\)。说白了......
  • 196. 删除重复的电子邮箱【Problem:Every derived table must have its own alias】
    SQL-Boy上线,最近在写SQL语句遇到了这样的问题。Problem:Everyderivedtablemusthaveitsownalias错误语句如下deletefromPersonwhereidnotin(selectidfrom(selectmin(id)asidfromPersongroupbyemail)......