A. Suffix Three
题意:
本题要求你设计一个语言检索系统。
题目保证每个句子的后缀都包含关键字。
思路:
- 可以直接暴力匹配,
但是可以观察每个关键字的特征,之后if,判断即可。
AC(IF)
#include <iostream>
#include <string>
using namespace std;
const string ans[]={"FILIPINO","JAPANESE","KOREAN"};
int main()
{
int t;cin>>t;
while(t--){
string s;
cin>>s;
int len=s.size();
if(s[len-1]=='o')cout<<ans[0]<<endl;
else if(s[len-2]=='s')cout<<ans[1]<<endl;
else if(s[len-1]=='a')cout<<ans[2]<<endl;
}
return 0;
}
AC(暴力匹配)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const string tmp[]={"op","used","usam","adinm"};
const string ans[]={"FILIPINO","JAPANESE","KOREAN"};
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
string s;cin>>s;
reverse(s.begin(),s.end());
string ta=s.substr(0,2);
int fl=1;
if(ta==tmp[0])fl=1;
ta=s.substr(0,4);
if(ta==tmp[1]||ta==tmp[2])fl=2;
ta=s.substr(0,5);
if(ta==tmp[3])fl=3;
fl--;
cout<<ans[fl]<<endl;
}
return 0;
}
B. Azamon Web Services
题意:
给你一个s串,和c串。
现在只能调整一组s【i】和s【j】使得
s
<
c
s<c
s<c
思路:
- 预处理suf后缀统计一下
i
i
i位置后的最小字母。(注意:
假如最小的是A,那么最右边的A明显更优
) - 之后贪心,假如s【 i i i】位置和s【suf【i】】不同,那么就直接交换,然后break。
- 再比较
AC(赛后)
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
string s1,s2;
cin>>s1>>s2;
if(s1<s2)cout<<s1<<endl;
else {
int len=s1.size();
int suf[6000];
for(int i=len-1; i>=0; i--){
suf[i]=i;
if(i!=len-1 && s1[suf[i+1]]<=s1[suf[i]])suf[i]=suf[i+1];//suf[i]=min(suf[i+1],suf[i]);
}
for(int i=0,j=0; i<s1.size()&&j<s2.size(); i++,j++){
if(s1[suf[i]]!=s1[i]){
swap(s1[i],s1[suf[i]]);
break;
}
}
if(s1<s2)cout<<s1<<endl;
else cout<<"---"<<endl;
}
}
return 0;
}
AC(赛中)
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
string s1,s2;
cin>>s1>>s2;
if(s1<s2)cout<<s1<<endl;
else {
int len=s1.size();
int suf[6000];
for(int i=len-1; i>=0; i--){
suf[i]=i;
if(i!=len-1 && s1[suf[i+1]]<=s1[suf[i]])suf[i]=suf[i+1];//suf[i]=min(suf[i+1],suf[i]);
}
for(int i=0,j=0; i<s1.size(); i++,j++){
if(s1[i]>s2[j]&&suf[i]!=i){
swap(s1[i],s1[suf[i]]);
break;
}else if(s1[i]==s2[j]&&suf[i]!=i){
if(s1[suf[i]]<s2[j]){
swap(s1[i],s1[suf[i]]);
break;
}
}
}
if(s1<s2)cout<<s1<<endl;
else cout<<"---"<<endl;
}
}
return 0;
}
C. Cut and Paste(模拟)
题意:
-
光标的定义:
-
有三个操作。
思路:
就是模拟。不过因为长度可能很大,所以要分开计算。
- 由于每一次操作,都是在原s上的扩充,所以先把前x个的字符串得到。
- 之后再算x次操作后,的长度。
AC(赛后)
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
string s;
int x;
void append(ll &len, int mul, int l, int r){
for(int i=2; i<=mul; i++){
for(int j=l; j<=r; j++){
if(len<x)s+=s[j],len++;
}
if(len>=x)return ;
}
}
int main()
{
int t;
cin>>t;
while(t--){
cin>>x;
cin>>s;
ll len,ans;
ans=len=s.size();
for(int i=0; i<len; i++)s[i]=s[i]-'0';
for(int i=1; i<=x; i++){
int cur=i-1;
append(len,s[cur],i,len-1);
if(len>=x)break;
}
for(int i=1; i<=x; i++){
int cur=i-1;
ll suf=(ans-i+mod)%mod;
for(int j=2; j<=s[cur]; j++)ans=(ans+suf)%mod;
}
cout<<ans<<endl;
}
return 0;
}
AC(赛中,迭代变量自增码歪,一直debug到结束qwq)
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
ll x,len,ans;cin>>x;
string s;
cin>>s;
ans=len=s.size();
for(int i=0; i<len; i++)s[i]=s[i]-'0';
for(int i=1; i<=x; i++){
int cur=i-1;
if(len>=x)break;// if(s[cur]==1)continue;// time=s[cur]-'0';
string tm=s.substr(i,len-i);
//cout<<"mod of the tm :"<<endl;
//for(int j=0; j<len-i; j++)cout<<(int)tm[j];
// cout<<endl;
int past_len=len-i;
for(int j=2; j<=s[cur]; j++){
// cout<<"j == "<<j<<endl;
//cout<<"len== "<<len<<endl;
if(len+past_len<=x)s+=tm,len+=past_len;
else {
int k=0;
//cout<<(int)tm[0]<<endl;
for(k=0; len+k+1<=x; k++){
//cout<<"tm[k] :"<<tm[k]<<endl;
s+=tm[k];
}
len+=k;
break;
}
}
// cout<<"s and len :"<<endl;
//for(int j=0; j<len; j++)cout<<(int)s[j];
//cout<<endl;
// cout<<len<<endl;
}
for(ll i=1; i<=x; i++){
int cur=i-1;///int time=s[cur]-'0';///if(s[cur]==1)continue;
ll suf=(ans+mod-i)%mod;
// ll suf=( (ans-i)+mod)%mod;
for(int j=2; j<=s[cur]; j++)ans=(ans+suf)%mod;
}
cout<<ans<<endl;
}
return 0;
}