shsudo apt update
sudo apt install openssh-server
sudo systemctl status ssh
sudo ufw allow ssh
sudo passwd root
vi /etc/ssh/sshd_config
#修改如下内容 设置PermitRootLogin 其他的配置默认是不开启root访问的
PermitRootLogin yes
sudo service sshd restart
# or
sudo systemctl restart sshd
vp了2023济南icpc,卡在一个典题上面(还是太菜了)。
题目链接:https://codeforces.com/gym/104901
直接说结论,给定一个无向图(无重边自环),每条边只能选择两个端点的其中一个,且必须选出一个,很显然对于其中一个连通块的选择方案只有 种(第一个点选或者不选一旦确定,后面点的状态是固定的),所以总共的选择方案为 , 为连通块的数量,当然前提是每个连通块都是二分图。
回到这个题,(设矩阵为 )当第 列和第 列 的个数超过 时无解,为 时不需要连边,为 时,若在同一行也不需要连,其他情况说明两个 在不同的行,设为 ,有两种情况:
1.两个 在同一列,说明两者必须一个反转,一个不反转
2.两个 在不同列,说明两个必须同时不变,或者同时反转
设 表示反转第 行, 对应不翻转第 行。
第一种情况,连 和 的边。
第二种情况,连 和 的边。
然后做二分图判定即可。
代码:
cpp#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define endl '\n'
const int M = 2e6 + 5;
const int inf = 2e9, mod = 1e9 + 7;
int a[M], b[M];
int vis[M];
string s[M];
vector<int> f[M];
void add(int x, int y)
{
f[x].push_back(y);
f[y].push_back(x);
// cout<<x<<" "<<y<<endl;
}
int dfs(int x){
for(auto to : f[x]){
if(vis[to]){
if(vis[x] == vis[to])return 0;
continue;
}
vis[to] = 3-vis[x];
if(!dfs(to))return 0;
}
return 1;
}
void solve()
{
int m, n;
cin >> m >> n;
for (int i = 1; i <= m; i++)
{
cin >> s[i];
s[i] = " " + s[i];
}
vector<int> cnt(n + 2);
vector<vector<int>> g(n + 2);
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
if (s[i][j] == '1')
{
cnt[j]++;
g[j].push_back(i);
}
}
for (int i = 1; i <= n; i++)
{
if (cnt[i] + cnt[n - i + 1] > 2)
{
cout << 0 << endl;
return;
}
}
for (int i = 1; i <= n / 2; i++)
{
if (cnt[i] + cnt[n - i + 1] == 2)
{
vector<int> v;
for (auto x : g[i])
v.push_back(x);
for (auto x : g[n - i + 1])
v.push_back(x);
int x = v[0], y = v[1];
if (x == y)
continue;
if (cnt[i] == 1)
{
add(x, y + m);
}
else
add(x, y);
}
}
for (int i = 1; i <= m; i++)
add(i, i + m);
int ans = 1;
for (int i = 1; i <= 2 * m; i++)
{
if (!vis[i])
{
vis[i] = 1;
if (!dfs(i))
ans = 0;
else
ans = ans * 2 % mod;
}
}
for (int i = 1; i <= 2 * m; ++i)
vis[i] = 0, f[i].clear();
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
}
sh
for i in {a..m}
do
rm -rf $i
mkdir $i
touch $i/$i.cpp $i/$i.in $i/$i.out
done
shfile=$1/$1.cpp
g++ -o ./temp/main $file
./temp/main < $1/$1.in > $1/$1.out
cat $1/$1.out
shg++ -o ./temp/gen gen.cpp
g++ -o ./temp/std std.cpp
g++ -o ./temp/tle tle.cpp
while true; do
./temp/gen > in.txt
./temp/tle < in.txt > tleout.txt
./temp/std < in.txt > out.txt
diff tleout.txt out.txt
done
https://www.luogu.com.cn/problem/UVA11572
cpp#include<bits/stdc++.h>
using namespace std;
// #define int long long
const int M=2e5+5;
int a[M];
pair<int,int>f[M];
int dp[M][21];
int lo[M];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
map<int,int>cnt;
int l=1,r=0;
int ans=0;
while(l<=n&&r<=n){
while (r<n)
{
if(cnt[a[r+1]]==1)break;
r++;
cnt[a[r]]++;
}
ans=max(ans,r-l+1);
// cout<<l<<' '<<r<<endl;
cnt[a[l]]--;
l++;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--)solve();
return 0;
}
duipai.cpp
cpp//freopen("in.txt", "r", stdin); // 读入数据生成器造出来的数据
//freopen("std.txt", "w", stdout); // 输出答案
#include <bits/stdc++.h>
using namespace std;
int main()
{
while (1) // 一直循环,直到找到不一样的数据
{
system("gen.exe");
system("tle.exe");
system("std.exe");
if (system("fc std.txt tle.txt")) // 当 fc 返回 1 时,说明这时数据不一样
break; // 不一样就跳出循环
}
return 0;
}
对拍脚本
g++ -o tle tle.cpp g++ -o std std.cpp g++ -o gen gen.cpp g++ -o duipai duipai.cpp duipai