zoukankan      html  css  js  c++  java
  • 最小表示法

    poj 1509

    不知道为什么用算法竞赛进阶指南上的那个代码交上去会WA

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define REP(i, a, b) for(register int i = (a); i < (b); i++)
    #define _for(i, a, b) for(register int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXN = 2e4 + 10;
    char a[MAXN];
    int n;
    
    int main()
    {
    	int T;
    	scanf("%d", &T);
    	while(T--)
    	{
    		scanf("%s", a + 1); n = strlen(a + 1);
    		_for(i, 1, n) a[n + i] = a[i];
    		int i = 1, j = 2, k;
    		while(i <= n && j <= n)
    		{
    			for(k = 0; k <= n && a[i+k] == a[j+k]; k++);
    			if(k == n) break;
    			if(a[i+k] > a[j+k])
    			{
    				i += k + 1;
    				if(i == j) i++;
    			}
    			else
    			{
    				j += k + 1;
    				if(i == j) j++;
    			}
    		}
    		printf("%d
    ", min(i, j));
    	}
    	return 0;
    }

    正解在i == j只有j++。我自己是觉得没有什么区别的,迷。

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define REP(i, a, b) for(register int i = (a); i < (b); i++)
    #define _for(i, a, b) for(register int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXN = 2e4 + 10;
    char a[MAXN];
    int n;
    
    int main()
    {
    	int T;
    	scanf("%d", &T);
    	while(T--)
    	{
    		scanf("%s", a + 1); n = strlen(a + 1);
    		_for(i, 1, n) a[n + i] = a[i];
    		int i = 1, j = 2, k;
    		while(i <= n && j <= n)
    		{
    			for(k = 0; k <= n && a[i+k] == a[j+k]; k++);
    			if(k == n) break;
    			if(a[i+k] > a[j+k]) i += k + 1;
    			else j += k + 1;
    			if(i == j) j++;
    		}
    		printf("%d
    ", min(i, j));
    	}
    	return 0;
    }

    vijos 1382

    好水。就处理出最小表示然后比较就好了。

    #include<bits/stdc++.h>
    #define REP(i, a, b) for(register int i = (a); i < (b); i++)
    #define _for(i, a, b) for(register int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXN = 1e6 + 10;
    char a[MAXN], b[MAXN], t[MAXN];
    int n;
    
    void deal(char* s)
    {
    	int k, i = 1, j = 2;
    	_for(i, 1, n) s[n + i] = s[i];
    	while(i <= n && j <= n)
    	{
    		for(k = 0; k <= n && s[i + k] == s[j + k]; k++);
    		if(k == n) break;
    		if(s[i + k] > s[j + k]) i += k + 1;
    		else j += k + 1;
    		if(i == j) j++;
    	}
    	int p = min(i, j);
    	_for(i, 1, n) t[i] = s[p + i - 1];
    	_for(i, 1, n) s[i] = t[i];
    }
    
    int main()
    {
    	scanf("%s%s", a + 1, b + 1);
    	n = strlen(a + 1);
    	deal(a); deal(b);
    	
    	bool ok = true;
    	_for(i, 1, n)
    		if(a[i] != b[i])
    		{
    			ok = false;
    			break;
    		}
    	
    	if(ok)
    	{
    		puts("Yes");
    		_for(i, 1, n) putchar(a[i]);
    		puts("");
    	}
    	else puts("No");
    	
    	return 0;
    }
  • 相关阅读:
    xe5 android tts(Text To Speech) [转]
    xe5 android sample 中的 SimpleList 是怎样绑定的 [转]
    xe5 android 控制蓝牙[转]
    xe5 android 调用照相机获取拍的照片[转]
    XE5 Android 开发数据访问手机端[转]
    XE5 Android 开发实现手机打电话和发短信 [转]
    让VCL的皮肤用在手机程序里 让安桌程序不山寨[转]
    XE5 Android 开发数据访问server端[转]
    XE5 Android 开发实现手机打电话和发短信[转]
    Delphi XE5的Android开发平台搭建[转]
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819309.html
Copyright © 2011-2022 走看看