CCSU training contest(1)

l i n k link link

B LaTeX Expert

思维不难,就是读入有点恶心,用 g e t s gets gets读一行,然后用 s t r c m p strcmp strcmp判断是否为空行

#include <bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mk make_pair
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
char a[maxn],A[maxn];
struct node{
    
    
	string s;
	int id;
}t[maxn];
 
struct node1{
    
    
	char s[maxn];
	int id;
	bool operator < (const node1 & t)const
	{
    
    
		return id < t.id;
	}
}tmp[105];
map<string,int>mp;
int main()
{
    
    
	int cnt = 0,flag = 0;
	
 
	while(gets(a)){
    
    
		
		if(strcmp("\\begin{thebibliography}{99}", a) == 0)
		{
    
    
			break;	
		}
		
//		printf("*%s*",a); 
		for(int i=0;i<strlen(a);i++)
		{
    
    
			if(a[i] == '{')
			{
    
    
				if(flag == 0)flag = 1;
			}
			else if(a[i] == '}')flag = 0,++cnt;
			else if(flag == 1)
			{
    
    
				t[cnt].s += a[i];
			}
		}
		
	}
	
	for(int i=0;i<cnt;i++)
	{
    
    
		mp[t[i].s] = i;
	}
 
 
	int tot = 0;
	flag = 0;
	string ttt="";
	
	
//	puts("DDD!!!!!!!!!!!!!!!!!!!!!");
	while(gets(a))
	{
    
    
		if(strcmp("\\end{thebibliography}", a) == 0)
		{
    
    
			break;	
		}
		if(strcmp(a , "")==0)continue;
		
		strcpy(tmp[++tot].s,a);
		
//		printf("*");
//		puts(tmp[tot].s);
		
		for(int i=0;i<strlen(tmp[tot].s);i++)
		{
    
    
			if(tmp[tot].s[i] == '{')
			{
    
    
				ttt = "";
				if(flag == 0)flag = 1;
			}
			else if(tmp[tot].s[i] == '}')
			{
    
    
				flag = 0;
				tmp[tot].id = mp[ttt];
			}
			else if(flag == 1)
			{
    
    
				ttt += tmp[tot].s[i];
			}
		}
	}	
//	for(int i=1;i<=tot;i++)cout<<tmp[i].s<<' '<<tmp[i].id<<'\n';
	cnt = 0;
	flag = 1;
	for(int i=1;i<=tot;i++)
	{
    
    
		if(tmp[i].id != cnt++)
		{
    
    
			flag = 0;
			break;
		}
	}
	if(flag == 0)
	{
    
    
		puts("Incorrect");
		sort(tmp+1,tmp+tot+1);
		puts("\\begin{thebibliography}{99}");
		for(int i=1;i<=tot;i++)printf("%s\n",tmp[i].s);
		puts("\\end{thebibliography}");
	}
	else puts("Correct");
	return 0;
}

I Minimal Product

题意:先通过题目给的添加求出 A A A数组,然后求满足 i < j i<j i<j && a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j] && a [ i ] ∗ a [ j ] a[i]*a[j] a[i]a[j]的最小值。
题解:求 A A A数组的时候,有个地方要对2的32次方取模,我们可以利用 u n s i g n e d − i n t unsigned -int unsignedint自动取模,因为它的范围是0-2^32 - 1,算的时候自动溢出就相当于取模了。那个条件,对于正数来说维护前缀最小值。对于负数来说,维护比他小的前缀最大值,就是倒着维护后缀最大值。

#include <bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mk make_pair
#define pb push_back
using namespace std;
 
const int maxn = 1e7+10;
unsigned int b[maxn];
ll a[maxn];
ll ans[maxn];
int main()
{
    
    
	int T;
	cin >> T;
	while(T--)
	{
    
    
		ll n,l,r;
		unsigned int x,y,z;
		cin >> n >> l >> r >> x >> y >> z >> b[1] >> b[2];
		
		for(int i=3;i<=n;i++)
		{
    
    
			b[i] = (x*b[i-2] + b[i-1]*y + z);
		}
		
		for(int i=1;i<=n;i++)
		{
    
    
			a[i] = b[i]%(r-l+1)+l;
//			printf("%d ",a[i]);
			
		}
		
		
		ll mi = 1e18,ma = -1e18;
		ll ans = 4e18;
		for(int i=1;i<=n;i++)
		{
    
    
			if(a[i] >= 0 && a[i] > mi)ans = min(ans , a[i]*mi);
			mi = min(a[i],mi);
		}
		
		
		for(int i = n;i >=1;i--)
		{
    
    
			if(a[i] <= 0)
			{
    
    
				if(a[i] < ma)ans = min(ans,a[i]*ma);
				ma = max(ma , a[i]);
			}
		}
		
		if(ans == 4e18)puts("IMPOSSIBLE");
		else printf("%lld\n",ans);
				
	} 
	return 0;
}

k Right Expansion Of The Mind

题意:一个字符串由 s s s串和 t t t串,t串无限循环接在s串后面,如果A字符串是B字符串的子串且B字符串也是A字符串的子串,那么就可以分为一组。输出可以分成多少组,并且输出分组方案。

思路:如果t串的字母字母种类不一样,那么他们一定不能分成一组。s串倒着往前遍历,找到第一个位置,这个位置的字母在s串中没有,把他切割开,如果切割开前面的部分一模一样,那么就可以分为一组。

#include <bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mk make_pair
#define pb push_back
using namespace std;

const int maxn = 1e5+10;
const int mod = 1e9+7,mod1 = 998244353;
const int base = 73,base1 = 47;

struct node {
    
    
	int sta,val,val1,id;
	bool operator < (const node & t)const
	{
    
    
		if(val == t.val){
    
    
			if(val1 == t.val1)return sta < t.sta;
			else return val1 < t.val1;
		}
		return val < t.val;
	}
}a[maxn];

vector<int>G[maxn];
int main()
{
    
    
	int n;
	cin >> n;
	for(int i=1;i<=n;i++)
	{
    
    
		string s,s1;
		cin >> s >> s1;
		int stas = 0;
		for(int j=0;j<s1.size();j++)
		{
    
    
			int p = s1[j] - 'a';
			stas |= (1<<p);
		}
		a[i].sta = stas;
		a[i].id = i;
		
		int flag = -1;
		for(int j=s.size()-1;j>=0;j--)
		{
    
    
			int p = s[j] - 'a';
			if((stas&(1<<p)) == 0)
			{
    
    
				flag = j;
				break;
			}
		}
		
		int v = 0,v1 = 0;
		for(int j=0;j<=flag;j++)
		{
    
    
			int p = s[j]-'a'+1;
			v = 1ll*base*v%mod + p;
			v%=mod;
			
			v1 = 1ll*base1*v1%mod1 + p;
			v1%=mod1;
		}
		
		a[i].val = v;
		a[i].val1 = v1;
	}
	
	sort(a+1,a+1+n);
		
		
	int l = 1,r = 1,cnt = 1;
	while(r <= n)
	{
    
    
		if(a[l].val == a[r].val && a[l].val1 == a[r].val1 && a[l].sta == a[r].sta)
		{
    
    
			G[cnt].pb(a[r].id);
			r++;
		}
		else l = r,cnt++;
	}

	
	cout<<cnt<<'\n';
	for(int i=1;i<=cnt;i++)
	{
    
    
		cout<<G[i].size()<<' ';
		for(int j=0;j<G[i].size();j++)printf("%d%c",G[i][j],j==G[i].size()-1?'\n':' ');
	}
		
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44499508/article/details/107058791
今日推荐