這題真卡空間==
這道題就是判斷是否圖中有歐拉路,判斷圖是否聯通
歐拉路:圖中度數爲奇數的點爲0或者2
判斷圖是否連通,直接dfs遍歷一次圖就行了
但是這道題輸入的是25w string 用map會t的
我們要用到字典樹
我的字典樹模板
int newnode(){
for(int i=0;i<27;i++){
nxt[l][i] = -1;
}
l++;
return l-1;
}
void init(){
l = 0, root = 0;
newnode();
}
int insert(char a[]){
int len = strlen(a);
int now = root;
for(int i=0;i<len;i++){
int t = a[i]-'a';
if(nxt[now][t] == -1){
nxt[now][t] = newnode();
}
now = nxt[now][t];
}
}
代碼入下
/********************************************
Author :Crystal
Created Time :
File Name :
********************************************/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
#define MEM(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a);
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
//#define LOCAL
struct node
{
/* data */
int u,v;
}a[500050];
int t = 0;
int cnt = 0;
int degree[500050];
int pnt[500050],head[500050],nxt[500050];
bool vis[500050];
int Nxt[550000][27];
int ans[550000][27];
int l = 0,root = 0;
int newnode(){
for(int i=0;i<27;i++){
Nxt[l][i]=-1;
}
l++;
return l-1;
}
int insert(char a[]){
int len = strlen(a);
int now = root;
int res = 0;
for(int i=0;i<len;i++){
int t = a[i]-'a';
if(Nxt[now][t] == -1){
Nxt[now][t] = newnode();
}
res = now;
now = Nxt[now][t];
}
if(len == 0)return 1;
if(ans[res][a[len-1]-'a']){
return ans[res][a[len-1]-'a'];
}
else{
return ans[res][a[len-1]-'a'] = ++cnt;
}
}
void addedge(int u,int v){
pnt[t] = v;
nxt[t] = head[u];
head[u] = t++;
}
void dfs(int u){
vis[u] = 1;
for(int i=head[u];i!=-1;i=nxt[i]){
int v=pnt[i];
if(!vis[v]){
dfs(v);
}
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// freopen("out.txt","w",stdout);
#endif
MEM(head,-1);
int ver = 0;
char aa[20];
char bb[20];
newnode();
while(scanf("%s%s",aa,bb)!=EOF){
a[ver].u = insert(aa);
a[ver].v = insert(bb);
ver++;
}
for(int i=0;i<ver;i++){
degree[a[i].u]++;
degree[a[i].v]++;
addedge(a[i].u,a[i].v);
addedge(a[i].v,a[i].u);
}
dfs(1);
int ccnt = 0;
int even = 0;
for(int i=1;i<=cnt;i++){
if(vis[i])ccnt++;
if(degree[i]%2){
even++;
}
}
if(ccnt == cnt){
if(even == 0 || even == 2){
cout <<"Possible\n";
}
else cout <<"Impossible\n";
}
else cout << "Impossible\n";
return 0;
}