T1
/*
思路:
遍历表达式s,
若当前字符是数字,直接赋值给:=左边的字母;
若当前字符是字母,则若其处于:=左边,记录接下来要赋值的字母;
否则,将当前字母的值赋值给:=左边的字母。
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int a,b,c;
bool fa,fb,fc;
int cnt;
signed main(){
ios::sync_with_stdio(0);
cin>>s;
for(int i=0;s[i];i++){
if(islower(s[i])){
if(cnt%2==0){
if(s[i]=='a') fa=1;
if(s[i]=='b') fb=1;
if(s[i]=='c') fc=1;
}
if(cnt%2==1){
if(fa){
if(s[i]=='a') a=a;
if(s[i]=='b') a=b;
if(s[i]=='c') a=c;
fa=0;
}
if(fb){
if(s[i]=='a') b=a;
if(s[i]=='b') b=b;
if(s[i]=='c') b=c;
fb=0;
}
if(fc){
if(s[i]=='a') c=a;
if(s[i]=='b') c=b;
if(s[i]=='c') c=c;
fc=0;
}
}
cnt++;
}
if(isdigit(s[i])){
if(fa) a=s[i]-'0',fa=0;
if(fb) b=s[i]-'0',fb=0;
if(fc) c=s[i]-'0',fc=0;
cnt++;
}
}
cout<<a<<' '<<b<<' '<<c<<'\n';
return 0;
}
T2
/*
思路:
贪心,每次扫一遍字符串,看到一个与目标不相同就改一次,知道相同为止。
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
string bg,ed;
int ans=-1e9;
void dfs(int sum){
if(bg==ed){
ans=max(ans,sum); return;
}
for(int i=0;i<bg.size();i++){
if(bg[i]!=ed[i]){
bg[i]=(bg[i]=='o'?'*':'o');
bg[i+1]=(bg[i+1]=='o'?'*':'o');
dfs(sum+1);
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin>>bg>>ed;
dfs(0);
cout<<ans;
return 0;
}
T3
/*
极其恶心的模拟qwq
我们尝试枚举回文串的中心点,
对于奇回文串,直接双指针从中心点向外扩展,直到两个指针指向的字符不相同为止。
对于奇回文串,从中心点和中心点的下一字符向外扩展,直到两个指针指向的字符不相同为止。
在不断地扩展中更新最大答案即可。
但是题目要求我们输出原字符串,而扩展时不可以按原字符串扩展,
因此我们在扩展时可以使用原字符串的所有字母转为小写后的字符串,
但是要记录下新字符串中的每个字符在原字符中的下标,
同时在更新答案时可以同时记录左端点,
最后从最大答案的左端点对应的原下标到这个下标+答案-1的这段区间内的字符输出即可。
当然这题还可以用二分+hash做,具体见https://www.acwing.com/problem/content/141/,复杂度O(nlogn)
也可以用Manacher做,O(n)直接起飞。
*/
#include<bits/stdc++.h>
using namespace std;
string s,t,ss;
int ans=-1e9,tot,st;
int pos[20031];
pair<int,int> check(int x,int y){
int l=x,r=y;
if(ss[l]!=ss[r]) return make_pair(-1e9,-1e9);
while(l>0&&r+1<ss.size()&&ss[l-1]==ss[r+1])
l--,r++;
return make_pair(r-l+1,l);
}
signed main(){
//freopen("P1210_3.in","r",stdin);
while(getline(cin,t)) s=s+t+"\n";
for(int i=0;s[i];i++)
if(islower(s[i])||isupper(s[i]))
pos[tot]=i,ss+=tolower(s[i]),tot++;
//cout<<ss<<'\n';
for(int i=0;i<ss.size();i++){
pair<int,int> x=check(i,i);
//cout<<ss[i]<<' '<<x.first<<' '<<x.second<<'\n';
if(x.first>ans)
ans=x.first,st=x.second;
}
for(int i=0;i+1<ss.size();i++){
pair<int,int> x=check(i,i+1);
//cout<<ss[i]<<' '<<x.first<<' '<<x.second<<'\n';
if(x.first>ans)
ans=x.first,st=x.second;
}
cout<<ans<<'\n';
for(int i=pos[st];i<=pos[st+ans-1];i++)
cout<<s[i];
return 0;
}
T4
/*
思路:
对原文档和所有密码全部排序,
然后遍历所有密码,再遍历原文档,
不断截取8个字符与当前密码比较,并累加匹配次数即可。
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s,p;
int n,ans;
signed main(){
ios::sync_with_stdio(0);
cin>>s>>n;
for(int i=1;i<=n;i++){
cin>>p;
sort(p.begin(),p.end());
for(int i=0;i+7<s.size();i++){
string ss=s.substr(i,8);
sort(ss.begin(),ss.end());
if(ss==p) ans++;
}
}
cout<<ans;
return 0;
}