Submission #748454

#TimeUsernameProblemLanguageResultExecution timeMemory
748454mariowongPaths (BOI18_paths)C++14
100 / 100
2418 ms221228 KiB
#include <bits/stdc++.h>
using namespace std;
 
int n,m,colour[300005],u,v,k,ct,len;
vector <int> ans[300005];
long long anss;
vector <int> edge[300005],now;
string pattern[335],r;
unordered_map <string,int> indx;
bool cmp(string a1,string a2){
	return (a1.length() < a2.length() || (a1.length() == a2.length() && a1 < a2));
}
int main() {
	ios::sync_with_stdio(false); 
	cin >> n >> m >> k;
	indx.reserve(500);
	for (int i=1;i<=n;i++){
		cin >> colour[i];
	} 
	for (int i=1;i<=m;i++){
		cin >> u >> v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	for (int i=1;i<(1<<k);i++){
		now.clear();
		for (int j=0;j<k;j++){
			if ((i&(1<<j)) > 0)
			now.push_back(j+1);
		}
		do{
			ct++;
			for (int i=0;i<now.size();i++){
				pattern[ct]+=char(now[i]+'0');
			}
		}while (next_permutation(now.begin(),now.end()));
	}
	sort(pattern+1,pattern+1+ct,cmp);
	for (int i=1;i<=n;i++){
		for (int j=1;j<=ct+1;j++){
			ans[i].push_back(0);
		}
	}
	for (int i=1;i<=ct;i++){
		indx[pattern[i]]=i;
		for (int j=1;j<=n;j++){
			if (pattern[i].length() == 1 && colour[j] == pattern[i][0]-'0')
			ans[j][i]=1;
			else
			if (colour[j] == pattern[i][0]-'0'){
				r.clear(); len=pattern[i].length();
				for (int k=1;k<len;k++){
					r+=pattern[i][k];
				}
				for (int k=0;k<edge[j].size();k++){
					ans[j][i]+=ans[edge[j][k]][indx[r]];
				}	
			}
		}
	}
	for (int i=1;i<=n;i++){
		for (int j=1;j<=ct;j++){
			anss+=ans[i][j];
		}
	}
	cout << anss-n << "\n";
	return 0;
}

Compilation message (stderr)

paths.cpp: In function 'int main()':
paths.cpp:33:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |    for (int i=0;i<now.size();i++){
      |                 ~^~~~~~~~~~~
paths.cpp:55:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for (int k=0;k<edge[j].size();k++){
      |                  ~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...